Haskell:按奇数和偶数排序列表

时间:2016-12-17 12:24:51

标签: haskell

我是Haskell的新手。我知道Hugs已经老了,不再受支持了,但我的大学仍然使用它。
这是我的代码:

gio n = jako n ++ tazo n

jako [] = []
jako (a:b) = if a `mod` 2 == 1 then a:jako (tail b) else jako (tail b)

tazo [] = []
tazo (a:b) = if a `mod` 2 == 0 then a:tazo (tail b) else tazo (tail b)

我要做的是拿一个清单,然后将奇数列表与偶数列表联合起来。例如gio [1,2,3,4,5,6,7,8,9] = [1,3,5,7,9,2,4,6,8] 但在我的情况下,它返回Program error: {tail []}或如果原始列表长度是偶数,它只返回奇数部分列表。例如:gio [1,2,3,4,5,6,7,8] = [1,3,5,7]似乎在调用jako n时它会更改列表,它会通过引用或类似的方式传递列表。可以改变什么来实现目标? P.S我不需要一些能够做到这一点的库函数,它需要通过使用我的函数来完成。感谢。

2 个答案:

答案 0 :(得分:1)

当输入为a:b时,b部分是尾部,因此无需使用tail b - 这将是尾部的-tail,当尾b为空时(即输入长度为1),可以触发运行时错误。此外,即使错误不是问题,再次使用尾部会跳过列表的下一个元素,这是错误的。

解决方案是从代码中删除尾部:

gio n = jako n ++ tazo n

jako [] = []
jako (a:b) = if a `mod` 2 == 1 then a:jako b else jako b

tazo [] = []
tazo (a:b) = if a `mod` 2 == 0 then a:tazo b else tazo b

答案 1 :(得分:0)

gio :: Integral a => [a] -> [a]
gio n = jako n ++ tazo n
  where
    jako [] = []
    jako (x:xs)
      | isOdd x     = x:jako xs
      | otherwise = jako xs
    tazo [] = []
    tazo (x:xs)
      | isEven x    = x:tazo xs
      | otherwise = tazo xs
    isEven n = mod n 2 == 0
    isOdd  n = mod n 2 /= 0