Syntax 为什么哈斯克尔的说法是错误的?
我有一个Haskell文件,如下所示:Syntax 为什么哈斯克尔的说法是错误的?,syntax,haskell,syntax-error,Syntax,Haskell,Syntax Error,我有一个Haskell文件,如下所示: longest::[Integer]->[Integer]->[Integer] max a b = if length a > length b then a else b llfs::[Integer]->Integer llfs li = length(foldl longest group(li)) llfs([1, 2, 3, 3, 4, 5, 1, 1, 1]) import List longest::[Int
longest::[Integer]->[Integer]->[Integer]
max a b = if length a > length b then a else b
llfs::[Integer]->Integer
llfs li = length(foldl longest group(li))
llfs([1, 2, 3, 3, 4, 5, 1, 1, 1])
import List
longest::[Integer]->[Integer]->[Integer]
longest a b = if length a > length b then a else b
llfs::[Integer]->Integer
llfs li = length(foldl longest group(li))
main = print (llfs [1, 2, 3, 3, 4, 5, 1, 1, 1])
它应该在最后打印函数调用的结果,但是当我运行该文件时,我得到以下错误:
parse error (possibly incorrect indentation)
我不明白我做错了什么。我该怎么做才能修好它
编辑 将最后一行放入主函数后,如下所示:
longest::[Integer]->[Integer]->[Integer]
max a b = if length a > length b then a else b
llfs::[Integer]->Integer
llfs li = length(foldl longest group(li))
llfs([1, 2, 3, 3, 4, 5, 1, 1, 1])
import List
longest::[Integer]->[Integer]->[Integer]
longest a b = if length a > length b then a else b
llfs::[Integer]->Integer
llfs li = length(foldl longest group(li))
main = print (llfs [1, 2, 3, 3, 4, 5, 1, 1, 1])
我现在得到以下错误:
C:\Users\Martin\Desktop\Haskell\Q1.hs:7:31:
Couldn't match expected type `[Integer]'
against inferred type `[a] -> [[a]]'
In the second argument of `foldl', namely `group'
In the first argument of `length', namely
`(foldl longest group (li))'
In the expression: length (foldl longest group (li))
这个看起来有点难!如何解决它?您不能像在python或其他脚本语言中那样在文件范围内调用函数。因此,最后一行中对
llfs
的“调用”是一个错误。尝试在main
中打印结果:
main = print (llfs [1, 2, 3, 3, 4, 5, 1, 1, 1])
此时,“函数调用”看起来像是一个不完整的函数定义,右侧缺失,这导致了令人惊讶的错误消息:
llfs (...) = abc
你的代码不正确 这个 应该是
longest::[Integer]->[Integer]->[Integer]
longest a b = if length a > length b then a else b
你需要一个主函数
main = do print llfs([1, 2, 3, 3, 4, 5, 1, 1, 1])
只是为了改进代码,如果您有一个函数签名,并给它一个小写字母(s)作为其类型(比如字母a),它将成为泛型。比如说
longest:: [a] -> [a] -> [a]
longest x y = if length x > length y then x else y
这意味着它不只是处理整数列表,而是处理任何列表。突然间,您有了一个非常可重用的函数。问题在于这一行:
llfs([1, 2, 3, 3, 4, 5, 1, 1, 1])
这不是一个函数声明。我认为您正在尝试进行函数调用,在这种情况下,您需要将其放入
main
声明中。您还可以将Haskell文件加载到解释器(例如,ghci
)中,并在解释器控制台中执行函数调用。问题在于最后一行没有定义函数,正如其他人所述。您的代码中有更多错误。看起来这就是您要做的:
import Data.List
longest_group_size :: [Integer] -> Int
longest_group_size = maximum . map length . group
main :: IO ()
main = print $ longest_group_size [1, 2, 3, 3, 4, 5, 1, 1, 1]
注意:
llfs li = length(foldl longest group(li))
解释器将group
作为foldl
的第二个参数。编写组(li)
与编写组(li)
没有什么不同
另外,foldl
需要一个初始值<另一方面,code>foldl1使用第一个列表元素作为其初始值。尝试:
llfs li = length (foldl1 longest (group li))
(编辑以删除第一个错误答案。)这不是两个错误的直接原因,但我认为这是造成误解的一个因素。在Haskell中,您永远不会编写
group(li)
。在单个参数中插入括号是没有意义的-它完全等同于组li
。如果您试图将此函数调用的结果传递给另一个函数,则需要将整个表达式括起来-(组li)
-或使用Caleb建议的$
运算符。更新中存在两个小问题。首先,看起来您试图将组
结果作为参数传递给foldl
。正确的说法是(组li)
而不是组(li)
第二种说法是foldl
需要一个基本情况。Caleb建议使用foldl1
是一个可能适合您的选项。此文件还有其他内容吗?可能是一个主函数?不,就是这样,据我所知,Haskell只是在文件(比如python)中遇到函数调用时运行函数调用,编辑问题以反映一个新的错误,顺便说一下,对于llfs函数,您可能需要签出Data.List.maximumBy,然后签出Data.function.onOk,所以这是一个更好的解决方案。尽管“llfs li=length$foldl1 longest$groupli”与“llfs li=length(foldl1 longest(groupli))相同,但我仍然希望理解我遇到的这个新错误@马丁:那就找一个好的教程,熟悉一下$operator。它非常非常有用;-)@Caleb:你不需要只对一条语句使用“do”。用foldl1代替foldl解决了这个问题!该死,我明白为什么,我错读了foldl和foldl1+1的文档,以便更清楚地指出错误的原因,而不仅仅是correction@Martin当前位置对于大多数Haskell程序员来说,这将更加困难。我认为您还不习惯Haskell语法。