我有下面的代码,它有一个保护功能,可以打印出儿童、成人和老年人的特定价格:
tickets::String -> Integer -> Float
tickets x y
|x == "Child" = 7.5 * fromIntegral y
|x == "Adult" = 12.5 * fromIntegral y
|otherwise = 8.0 * fromIntegral y
main = do
print& tickets "Child" 5
然而,当我尝试运行它时,我得到了这个错误:
main.hs:9:6: error:
Variable not in scope: (&) :: (a0 -> IO ()) -> Float -> t
Float部分应该让函数根据我的主要函数打印出5张儿童票的总价,我想知道如何在学习Haskell时避免这个错误。如果有人能帮我找出如何修复这个错误,我将不胜感激!
Haskell一开始学习起来可能很有挑战性。值得庆幸的是,您可以使用一些好的工具(stack、ghci等(。
首先,记下你遇到的错误。这意味着变量(&)
不在作用域中。这应该是你第一次暗示出了问题。
main.hs:9:6: error:
Variable not in scope: (&) :: (a0 -> IO ()) -> Float -> t
上面的错误消息意味着编译器不理解某个变量CCD_ 2;范围内"这意味着,无论出于何种原因,编译器都不能";参见";这个变量的任何定义——要么根本没有定义,要么定义的模块还没有导入。
你可以做的另一件事是检查你现在拥有的代码类型,将这些类型与你想要生成的类型进行比较,然后填补空白。
例如,您可以在项目根目录中使用stack ghci
启动ghci。然后您可以检查print
:的类型
> :t print
print :: Show a => a -> IO ()
这表示print
采用某种类型的a
来实现Show
。如果我们检查tickets
,我们会看到:
:t tickets
tickets :: String -> Integer -> Float
然后作为一个快速的";健全性检查";我们可以检查Float是否可以显示:
> show ((7.5)::Float)
"7.5"
现在我们对main
应该是什么样子有了一个很好的想法:
main :: IO ()
main = print (tickets "Child" 5)
正如其他人所指出的,$
可以在这里使用($
可以帮助减少代码中的括号数量(:
main :: IO ()
main = print $ tickets "Child" 5
就在那儿!希望这有助于揭开Haskell的神秘面纱:(