Haskell-统一将给出无限类型
我是Haskell的新手,刚刚遇到这个问题/错误 我一点也不知道发生了什么,而且我也不太熟悉使用列表并将它们定义为Haskell-统一将给出无限类型,haskell,typeerror,Haskell,Typeerror,我是Haskell的新手,刚刚遇到这个问题/错误 我一点也不知道发生了什么,而且我也不太熟悉使用列表并将它们定义为(l:k)。。。我真的不知道我和k被认为是什么。。。l是元素,k是列表 无论如何,我希望有人能向我解释这些l和k的事情,或者在使用list的函数中,或者是一种编写这个简单的delete函数的方法,如果元素在列表中,它会找到所需元素的第一个外观并删除它,然后返回新的列表 delete :: Eq b => b -> [b] -> [b] delete
(l:k)
。。。我真的不知道我和k被认为是什么。。。l是元素,k是列表
无论如何,我希望有人能向我解释这些l和k的事情,或者在使用list的函数中,或者是一种编写这个简单的delete函数的方法,如果元素在列表中,它会找到所需元素的第一个外观并删除它,然后返回新的列表
delete :: Eq b => b -> [b] -> [b]
delete r (l:k)
| inside r k = [l]:delete(r k)
| otherwise = k
模式
l:k
有三个功能:
l
绑定到列表的第一个元素k
绑定到列表的其余部分r
与l
进行比较。如果它们相等,则只返回列表的其余部分。否则,将l
放回递归调用产生的列表中
如果列表是空的,您也需要通过返回一个空列表来处理它。(从[]
中删除r
只会产生[]
)
模式
l:k
有三个功能:
l
绑定到列表的第一个元素k
绑定到列表的其余部分r
与l
进行比较。如果它们相等,则只返回列表的其余部分。否则,将l
放回递归调用产生的列表中
如果列表是空的,您也需要通过返回一个空列表来处理它。(从[]
中删除r
只会产生[]
)
我认为,如果在编写列表处理算法之前,您对列表的表示方式有一个基本的了解,可能会有很大帮助。你在这里有一篇很好的文章,当然你不需要深入了解Haskell ccompiler的工作原理,也不需要深入了解范畴理论与Haskell的关系,等等。但是首先要有一些洞察力,这通常会有帮助。这里有两件事是错误的:你没有处理基本情况
[]
(空列表,而且[l]:删除(RK)
没有多大意义,因为l
是一个元素,您可能想将其重写为l:delete r k
。您想比较r
和l
,而不是忽略l
,并在k
中查找r
@WillemVanOnsem关于主题的另一个变体。谢谢大家,我很感激。我稍后将查看learnyouahaskell.com。我认为,如果在编写列表处理算法之前,您对列表的表示方式有一个基本的了解,这可能会有很大帮助。您在这里有一篇很好的文章,您不需要深入了解Haskell ccompiler的工作原理,或者类别理论与Haskel的关系l、 但是首先了解一些情况通常会有所帮助。这里有两件事是错误的:您没有处理基本情况[]
(空列表),而且[l]:delete(rk)
没有多大意义,因为l
是一个元素,您可能想将其重写为l:delete r k
。您想比较r
和l
,而不是忽略l
,并在k
中查找r
@WillemVanOnsem关于主题的另一个变体。谢谢大家,我很感激。我稍后我会查看learnyouahaskell.com。我想你的otherse是错误的,你的意思是:otherse=h:delete r t?谢谢你的帮助tho,我想我做到了。我想你的otherse是错误的,你的意思是:otherse=h:delete r t?谢谢你的帮助tho,我想我做到了。
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