haskell - 制作保护功能时,在 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 一开始可能很难学习。值得庆幸的是,您可以使用一些好的工具(堆栈、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 的神秘面纱 :)
推荐阅读
- c# - 尝试使用启动文件中的 GetSection 访问配置值时为空。(IOptions-config 检索)
- d3.js - D3 每个轴上不同的缩放系数
- sql - 删除另一个表没有指向的重复记录
- javascript - Fat Arrow 函数/回调函数的类型是什么?
- google-smart-home - action.devices.traits.Modes 上的某些模式似乎不起作用
- c - 如何识别特定文件是否在C中第一次被调用
- discord - Discord bot 检查我的世界服务器是否在线
- for-loop - 推后是否影响标量值...(Raku)
- linux - Bash 功能可在后台自动运行命令并拒绝
- c# - 如何在 asp.net Core Razor Pages 中填充复选框列表?