Haskell将列表分为两部分:偶数和奇数

时间:2018-06-24 11:47:08

标签: haskell zip

我通过这个简单的练习使自己发疯。我只想将列表一分为二,将偶数和奇数分开。我的代码如下:

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]

我在做什么错了。

2 个答案:

答案 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])
  [] -> ([],[])