【问题标题】:Haskell - unification would give infinite typeHaskell - 统一将给出无限类型
【发布时间】:2018-04-06 12:31:42
【问题描述】:

我是 Haskell 的新手,我刚刚遇到了这个问题/错误。

我不知道发生了什么,我也不太熟悉使用列表并将它们定义为(l:k)...我真的不知道 l 和 k 被认为是什么... l 是一个元素k 是一个列表?

无论如何,我很感激有人向我解释了这些 l 和 k 的事情,或者可能是 (l:t:k) 在使用列表的函数内,也许是一种编写这个简单删除函数的方法,鉴于元素在列表内,找到所需元素的首次出现并将其删除,返回新列表。

    delete :: Eq b => b -> [b] -> [b]
    delete r (l:k)
        | inside r k = [l]:delete(r k)
        | otherwise = k

【问题讨论】:

  • 我认为如果编写列表处理算法之前,您对列表的表示方式有一个基本的了解,这可能会有很大帮助。你在这里有一篇不错的文章learnyouahaskell.com/starting-out 当然你不需要深入了解 Haskell ccompiler 是如何工作的,或者类别理论是如何与 Haskell 相关的等等,但它通常有助于首先获得一些见解。
  • 这里有两件事错了:你没有处理基本情况[](空列表,此外[l] : delete (r k)没有多大意义,因为l是一个元素,你可能想将其重写为l : delete r k
  • 您想比较rl,而不是忽略l 并在k 中查找r
  • 谢谢你们,我很感激。稍后我会查看 learnyouahaskell.com。

标签: haskell typeerror


【解决方案1】:

模式l:k 做了三件事:

  1. 如果模式匹配,它会告诉您列表不为空
  2. 它将l 绑定到列表的第一个元素
  3. 它将k 绑定到列表的其余部分。

如果您有一个非空列表,您希望将您的术语rl 进行比较。如果 它们 相等,则只需返回列表的其余部分。否则,您将 l 放回递归调用产生的列表中。

如果列表 为空,您也需要处理它,只需返回一个空列表即可。 (从[] 中删除r 会生成[]。)

delete :: Eq b => b -> [b] -> [b]
delete r (h:t) | r == h = t   -- h for head, t for tail
               | otherwise = h : delete r t
delete _ [] = []   -- base case

【讨论】:

  • 我认为你的 else 有问题,你的意思是: else = h:delete r t 吗?谢谢你的帮助,我想我做到了。
猜你喜欢
  • 1970-01-01
  • 2012-02-22
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多