algorithm - 给定一个列表列表,返回一个具有列表长度的列表(在另一个列表中)

标签 algorithm list haskell

当我尝试运行以下函数时,出现错误:

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 lengthliSTLon = 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 的无点定义>.

错误表明编译器对返回类型感到困惑。您正在尝试通过文字 01 以及列表形式(由最后一行构造)返回 Num。约束 Num [a] 只能使用扩展 FlexibleContexts。但实际上它只是说明了我上面描述的问题。这些类型的错误消息有时会令人困惑,因为编译器无法读懂您的想法,因此它假定您知道自己在做什么,并且仅在由于某些冲突而无法继续推断类型时才报告问题。

关于algorithm - 给定一个列表列表,返回一个具有列表长度的列表(在另一个列表中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43144712/

相关文章:

python - 来自 os.listdir() 的非字母数字列表顺序

C# List IList 或 IEnumerable 作为参数

haskell - Haskell 模式匹配的 F# 版本

parsing - 语法歧义: why?(问题是: "(a)"与 "(a-z)")

r - 使用 nVennR 生成维恩图时出错

javascript - *ngFor 需要为每个不同的对象生成 1 个 btn,但将相似的对象值放在同一个 btn 中

javascript - 如何滚动到 ul 列表中的 li 元素

C#归并排序性能

c++ - 对 std::multiset 中的相等范围进行排序

database - Haskell 数据库推荐?