我有一个看起来像这样的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])
哪个应该在最后打印出函数调用的结果,但是当我运行该文件时出现此错误:
parse error (possibly incorrect indentation)
我不明白我做错了什么。我该怎么做才能解决它?
修改
将最后一行放在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])
我现在收到以下错误:
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))
这个看起来有点困难!我该如何解决?
答案 0 :(得分:7)
您的代码不正确。
这个
longest::[Integer]->[Integer]->[Integer]
max a b = if length a > length b then a else b
应该是
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])
只是为了改进你的代码,如果你有一个函数签名并给它一个小写字母作为它的类型(比如字母a),它就变成了通用的。例如
longest:: [a] -> [a] -> [a]
longest x y = if length x > length y then x else y
意味着它不仅仅处理整数列表,而是处理任何事物的列表。突然间你有一个非常可重复使用的功能。
答案 1 :(得分:7)
在第
行llfs li = length(foldl longest group(li))
解释器将group
视为foldl
的第二个参数。写group(li)
与撰写group li
没有什么不同。
此外,foldl
需要初始值。另一方面,foldl1
使用第一个列表元素作为其初始值。尝试:
llfs li = length (foldl1 longest (group li))
(编辑删除第一个错误答案。)
答案 2 :(得分: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]
答案 3 :(得分:4)
问题是最后一行没有定义一个函数,正如其他人所说的那样。你的代码中有更多错误。看来这就是你想要做的事情:
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]
观察:
答案 4 :(得分:3)
您不能像在python或其他脚本语言中那样在文件范围内调用函数。因此,最后一行中对llfs
的“调用”是一个错误。尝试在main
:
main = print (llfs [1, 2, 3, 3, 4, 5, 1, 1, 1])
目前“函数调用”看起来像一个不完整的函数定义,右侧缺失,这会导致出现令人惊讶的错误消息:
llfs (...) = abc
答案 5 :(得分:3)
问题在于这一行:
llfs([1, 2, 3, 3, 4, 5, 1, 1, 1])
那不是函数声明。我想你正在尝试进行函数调用,在这种情况下你需要把它放在main
声明中。您还可以将Haskell文件加载到解释器(例如ghci
)并在解释器控制台中执行函数调用。
答案 6 :(得分:2)
这不是导致错误的直接原因,但我认为这是导致误解的一个因素。在Haskell中,你永远不会写group(li)
。对单个参数进行括号化是没有意义的 - 它完全等同于group li
。如果您试图将此函数调用的结果传递给另一个函数,则需要将整个表达式括起来 - (group li)
- 或使用像Caleb建议的$
运算符。
答案 7 :(得分:2)
更新的两个小问题。首先,您似乎试图将group
结果作为参数传递给foldl
。正确的说法是(group li)
而不是group(li)
第二种方式是foldl
需要一个基本案例。 Caleb建议使用foldl1
是一个可能对您有用的选项。