首页 > 解决方案 > 制作保护功能时,在 Haskell 中收到“变量不在范围内”错误

问题描述

我有以下代码,它具有保护功能并打印出儿童、成人和老年人的某些价格:

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

解决方案


Haskell 一开始可能很难学习。值得庆幸的是,您可以使用一些好的工具(堆栈、ghci 等)。

首先,请注意您遇到的错误。这是说变量(&)不在范围内。这应该是你第一次暗示有什么问题/不对劲。

main.hs:9:6: error:
Variable not in scope: (&) :: (a0 -> IO ()) -> Float -> t

上面的错误消息意味着编译器不理解某些变量(&),因为它不在“范围内”。这意味着,无论出于何种原因,编译器都无法“看到”这个变量的任何定义——要么根本没有定义,要么没有导入定义它的模块。

您可以做的另一件事是检查您现在拥有的代码的类型,将这些类型与您想要生成的类型进行比较,然后填补空白。

例如,您可以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 的神秘面纱 :)


推荐阅读