2011-11-04 55 views
1

我在与获取和在递归函数从列表中抛弃了第一值的问题,请删除。哈斯克尔:获取并从列表

下面是代码:

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 

提前致谢。

编辑:此时,只有我想用这个功能做的事情是从第一个列表由一个移动的所有项目到第二递归函数之一。之后,我会添加更多的东西来从列表中删除重复值。

+0

你能更清楚它是什么你想要做什么? – Apocalisp

+0

你想使用列表解析还是让..在子句中?要通过一个移动的元素之一,@Apocalisp的代码做这项工作 – nponeccop

+0

的'ParallelListComp'是通过使用'造成[... | ... | ...]'。除非你喜欢做某事,否则总是'[... | ...]'。 – 2011-11-04 21:18:43

回答

1

它看起来就像你正在试图做的:

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

但这基本上是reverse

reverse = foldl (flip (:)) [] 
+0

我要downvote,然后我阅读完整的问题:-) – Simon

0

除非你做功课或学习Haskell中,存在Data.Listnub功能。

+0

是的,我知道nub的功能,是的,它适用于学校,我不能使用它。 – Trac3

+0

难道是欺骗从'nub'源解除代码?无论是不是,为了学习,在查看“书后”之前,您应该尝试自己实现它。 –

+0

OK,下次还会添加标签功课..刚刚完成我的功能,Haskell是真正伟大的语言,但它是很难习惯吧:) – Trac3

0

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

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

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