Haskell:从列表中获取和删除

时间:2011-11-04 16:40:10

标签: haskell

我在递归函数中从列表中获取和删除第一个值时遇到问题。

以下是代码:

removeDuplicates a u = [if a == [] then u else removeDuplicates newA newU
                       | let newU = (head a):u 
                       | let newA = tail a]

错误:

Illegal parallel list comprehension: use -XParallelListComp

另一个想法是:

removeDuplicates a u = [if a == [] then u else removeDuplicates (tail a) newU
                       | let newU = (head a):u]

另一个错误:

Occurs check: cannot construct the infinite type: a0 = [a0]
    Expected type: [a0]
      Actual type: [[a0]]
    In the return type of a call of `removeDuplicates'
    In the expression: removeDuplicates (tail a) newU

提前致谢。

编辑:目前我只想尝试使用此功能将所有项目从第一个列表移动到第二个具有递归功能的项目。之后,我将添加更多内容以从列表中删除重复值。

3 个答案:

答案 0 :(得分:1)

看起来你正试图这样做:

removeDuplicates [] u = u
removeDuplicates (x:xs) u = removeDuplicates xs (x:u)

但这基本上是reverse

reverse = foldl (flip (:)) []

答案 1 :(得分:0)

除非你做家庭作业或学习haskell,否则nub中有Data.List个功能。

答案 2 :(得分:0)

您获得列表理解和“无限类型:a0 = [a0]”错误的原因是因为编译器正在读取括号作为定义列表。使用语法

f x = a + b
      where a = 10
            b = 20

f' x = let a = 3
           b = 4
       in a + b