【问题标题】:Given a List of Lists, return a Listh with Lists' length ( in another list)给定一个列表列表,返回一个列表长度的列表(在另一个列表中)
【发布时间】:2017-03-31 15:43:39
【问题描述】:

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

len' [] = 0
len' (_:xs) = 1 + len' xs

listlon [] = 0
listlon [[]] = 1
listlon (x:xs) = ((len' x):(listlon xs))

functions.hs:41:1: 错误: • 约束中的非类型变量参数:Num [a] (使用 FlexibleContexts 来允许这样做) • 检查推断类型时 listlon :: forall a t。 (Num [a], Num a) => [[t]] -> [a]

有人可以解释一下,如何解决这个问题?这个错误到底在表达什么?

【问题讨论】:

  • 始终使用类型签名。它们将使读者和您自己清楚您的意图,并帮助您理解错误消息。

标签: algorithm list haskell


【解决方案1】:

线

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。但实际上它只说明了我上面描述的问题。这类错误消息有时会令人困惑,因为编译器无法读懂您的想法,因此它假定您知道自己在做什么,并且仅在由于某些冲突而无法继续推断类型时才报告问题。

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 2012-06-29
    相关资源
    最近更新 更多