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)
这个看起来有点困难!我该如何解决?
您的代码不正确.
这个
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)
意味着它不仅仅是处理整数列表,而是处理任何事物的列表.突然间你有一个非常可重复使用的功能.
在线
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)
(编辑删除第一个错误答案.)
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)