我是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我不需要一些能够做到这一点的库函数,它需要通过使用我的函数来完成。感谢。
答案 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