当我尝试运行以下函数时,出现错误:
len' [] = 0
len' (_:xs) = 1 + len' xs
listlon [] = 0
listlon [[]] = 1
listlon (x:xs) = ((len' x):(listlon xs))
functions.hs:41:1: error: • Non type-variable argument in the constraint: Num [a] (Use FlexibleContexts to permit this) • When checking the inferred type listlon :: forall a t. (Num [a], Num a) => [[t]] -> [a]
谁能解释一下,如何解决这个问题?这个错误究竟传达了什么?
最佳答案
线
listlon [] = 0
产生输出 0
代替类型 [a]
。您很可能是指 liSTLon [] = []
。不过我建议使用 liSTLon = map length
或 liSTLon = map len'
。或者也许我只是不明白你真正想要的是什么。作为第一步,提供预期的签名总是有帮助的。您是否正在寻找函数 liSTLon::[[a]] -> [Int]
?
如果我的理解是正确的,最直接的解决方法是:
listlon [] = []
listlon [x] = [len' x]
listlon (x:xs) = len' x : listlon xs
这修复了类型。但是你可以注意到第二个等式是多余的,这就足够了
listlon [] = []
listlon (x:xs) = len' x : listlon xs
现在您可以注意到这实际上是在列表上映射 len'
,因此 map len'
作为 liSTLon
的无点定义>.
错误表明编译器对返回类型感到困惑。您正在尝试通过文字 0
和 1
以及列表形式(由最后一行构造)返回 Num
。约束 Num [a]
只能使用扩展 FlexibleContexts
。但实际上它只是说明了我上面描述的问题。这些类型的错误消息有时会令人困惑,因为编译器无法读懂您的想法,因此它假定您知道自己在做什么,并且仅在由于某些冲突而无法继续推断类型时才报告问题。
关于algorithm - 给定一个列表列表,返回一个具有列表长度的列表(在另一个列表中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43144712/