Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax 为什么哈斯克尔的说法是错误的?_Syntax_Haskell_Syntax Error - Fatal编程技术网

Syntax 为什么哈斯克尔的说法是错误的?

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

我有一个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::[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语法。