为什么我不能通过终端将Haskell文件加载到ghci中?
我刚刚开始学习Haskell,并且已经查找了现有的答案,所以请不要就此打倒我,但是为什么我无法使用为什么我不能通过终端将Haskell文件加载到ghci中?,haskell,Haskell,我刚刚开始学习Haskell,并且已经查找了现有的答案,所以请不要就此打倒我,但是为什么我无法使用:load-W filename.hs在终端中加载.hs文件 我在文件中的代码是: doubleList :: [Integer] -> [Integer] doubleList list = case list of [] -> [] (x:xs) -> x*2:list xs 如何将此文件加载到ghci中,然后使用正确的格式添加整数列表作为参数?正如注释中所暗示的,您的代码
:load-W filename.hs
在终端中加载.hs
文件
我在文件中的代码是:
doubleList :: [Integer] -> [Integer]
doubleList list = case list of
[] -> []
(x:xs) -> x*2:list xs
如何将此文件加载到ghci中,然后使用正确的格式添加整数列表作为参数?正如注释中所暗示的,您的代码对齐错误。
案例的各个分支。。。of
必须缩进以告诉Haskell它们“属于”它。这意味着你应该写:
doubleList :: [Integer] -> [Integer]
doubleList list = case list of
[] -> []
(x:xs) -> x*2:list xs
doubleList :: [Integer] -> [Integer]
doubleList list = case list of
[] -> []
(x:xs) -> x*2:doubleList xs
然后,在表达式x*2:list xs
中,您也在将[Integer]
类型的list
应用于[Integer]
类型的xs
。这根本无法进行打字检查。您可能打算编写对函数doubleList
的递归调用。这意味着你应该写:
doubleList :: [Integer] -> [Integer]
doubleList list = case list of
[] -> []
(x:xs) -> x*2:list xs
doubleList :: [Integer] -> [Integer]
doubleList list = case list of
[] -> []
(x:xs) -> x*2:doubleList xs
至于
-W
选项,在ghci
中加载文件与使用ghc
进行类型检查有点不同:您不能像ghc
那样将参数传递给:load
。正如@chi所解释的,您必须使用:set
来设置标志。什么是:load-W
?您是否尝试过加载文件名.hs?这一直有效。如果没有,当您尝试它时会发生什么?如果您的文件是这样的-它是无效的haskell,您应该得到一个错误-您应该通知我们。(首先,它的缩进不正确,其次,您尝试将list
应用于xs
-我认为您应该使用doubleList xs
)我猜-W
用于启用警告,这是一件好事。为此,可以在GHCi:set-W
中使用。之后,可以使用:l file.hs
加载该文件。警告也可以在源文件中启用,在文件的最顶端添加{-#OPTIONS-W#-}
。谢谢大家,我刚刚开始,非常感谢这些指针。不过为什么要用-3来回答这个问题呢?我的结构有什么问题吗?或者应该只有知道如何在这里设置帖子问题的人??