我通过这个简单的练习使自己发疯。我只想将列表一分为二,将偶数和奇数分开。我的代码如下:
module Proyecto1 where
separarPorPosicion :: [a] ->([a],[a])
separarPorPosicion xs= (pares,impares) where
pares = [x | (x,y)<- zip xs [1..], even y]
impares = [x | (x,y)<- zip xs [1..], odd y]
我得到的唯一结果就是我写的相同列表,和我写的相同方式。 例如,如果我输入[1,2,3,4,5,6],结果将以相同的方式显示为[1,2,3,4,5,6]。
这就是我在GHCi中编写的内容:
*Proyecto1> (1,2,3,4,5,6)
(1,2,3,4,5,6)
*Proyecto1> [1,2,3,4,5,6,7]
[1,2,3,4,5,6,7]
我在做什么错了。
答案 0 :(得分:5)
您的代码绝对正确,做得很好。这就是您的称呼方式。让我们来看看您的GHCi:
*Proyecto1> (1,2,3,4,5,6)
(1,2,3,4,5,6)
*Proyecto1> [1,2,3,4,5,6,7]
[1,2,3,4,5,6,7]
在GHCi中编写某些内容时,就是在要求它对其进行评估。因此,当您写[1,2,3,4,5,6,7]
时,您只是在说:“ [1,2,3,4,5,6,7]
的价值是什么?” 您没有使用功能!
您应该这样写:
*Proyecto1> separarPorPosicion [1,2,3,4,5,6,7]
([2,4,6], [1,3,5,7])
这告诉GHCi对值separarPorPosicion
使用函数[1,2,3,4,5,6,7]
。以前,您没有这样做。
旁注:您还写了(1,2,3,4,5,6)
。重要的是要知道这不是[Int]
类型的列表,而是(Int, Int, Int, Int, Int, Int)
类型的元组。因此,您不能写separarPorPosicion (1,2,3,4,5,6)
。这是行不通的。
答案 1 :(得分:2)
你说
如果我输入[1,2,3,4,5,6],结果将是[1,2,3,4,5,6]相同的方式
但是您应该输入的是函数调用:
ghci> separarPorPosicion [1,2,3,4,5,6]
([2,4,6],[1,3,5])
编写函数的另一种方法是:
separarPorPosicion xs = case xs of
o:e:ys -> let (es,os) = separarPorPosicion ys in (e:es,o:os)
[o] -> ([],[o])
[] -> ([],[])