Haskell-统一将给出无限类型

Haskell-统一将给出无限类型,haskell,typeerror,Haskell,Typeerror,我是Haskell的新手,刚刚遇到这个问题/错误 我一点也不知道发生了什么,而且我也不太熟悉使用列表并将它们定义为(l:k)。。。我真的不知道我和k被认为是什么。。。l是元素,k是列表 无论如何,我希望有人能向我解释这些l和k的事情,或者在使用list的函数中,或者是一种编写这个简单的delete函数的方法,如果元素在列表中,它会找到所需元素的第一个外观并删除它,然后返回新的列表 delete :: Eq b => b -> [b] -> [b] delete

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

我一点也不知道发生了什么,而且我也不太熟悉使用列表并将它们定义为
(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