为什么这个Haskell不正确?

Mar*_*tin 2 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])
Run Code Online (Sandbox Code Playgroud)

哪个应该在最后打印出函数调用的结果,但是当我运行该文件时,我收到此错误:

parse error (possibly incorrect indentation)
Run Code Online (Sandbox Code Playgroud)

我不明白我做错了什么.我该怎么做才能解决这个问题?


编辑

将最后一行放在main函数中后,如下所示:

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])
Run Code Online (Sandbox Code Playgroud)

我现在收到以下错误:

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))
Run Code Online (Sandbox Code Playgroud)

这个看起来有点困难!我该如何解决?

Yac*_*oby 7

您的代码不正确.

这个

longest::[Integer]->[Integer]->[Integer]
max a b = if length a > length b then a else b
Run Code Online (Sandbox Code Playgroud)

应该

longest::[Integer]->[Integer]->[Integer]
longest a b = if length a > length b then a else b
Run Code Online (Sandbox Code Playgroud)

而且你需要一个主要功能

main = do print llfs([1, 2, 3, 3, 4, 5, 1, 1, 1])
Run Code Online (Sandbox Code Playgroud)

只是为了改进你的代码,如果你有一个函数签名并给它一个小写字母作为它的类型(比如字母a),它就变得通用了.例如

longest:: [a] -> [a] -> [a]
longest x y = if length x > length y then x else y
Run Code Online (Sandbox Code Playgroud)

意味着它不仅仅是处理整数列表,而是处理任何事物的列表.突然间你有一个非常可重复使用的功能.


Nef*_*byr 7

在线

llfs li = length(foldl longest group(li))
Run Code Online (Sandbox Code Playgroud)

口译员正在group视为第二个论点foldl.写作group(li)与写作没有什么不同group li.

此外,还foldl需要一个初始值. foldl1另一方面,使用第一个列表元素作为其初始值.尝试:

llfs li = length (foldl1 longest (group li))
Run Code Online (Sandbox Code Playgroud)

(编辑删除第一个错误答案.)


Cal*_*leb 6

module Main where

import Data.List

longest::[Integer]->[Integer]->[Integer]
longest a b = if length a > length b then a else b

llfs::[Integer]->Int
llfs li = length $ foldl1 longest $ group li

main = do
    putStrLn $ show $ llfs [1, 2, 3, 3, 4, 5, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)