【发布时间】: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。 -
您想比较
r和l,而不是忽略l并在k中查找r。 -
@WillemVanOnsem Why doesn't this function work if I use “[xs]” instead of “xs”? 主题的另一种变体。
-
谢谢你们,我很感激。稍后我会查看 learnyouahaskell.com。