在制作保护功能时收到 Haskell "Variable not in Scope"错误



我有下面的代码,它有一个保护功能,可以打印出儿童、成人和老年人的特定价格:

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的神秘面纱:(

相关内容

  • 没有找到相关文章

最新更新