我刚刚开始学习Haskell并编写了两个函数,一个用于具有偶数长度的列表,另一个用于列出奇数长度的列表。这意味着“甚至'函数[0..7]返回[0,7,2,5,4,3,6,1],'奇数'函数[0..8]返回[0,7,2,5,4,3,6,1,8] - 这些是我需要的结果。 然而,经过大量的工作后,我仍然无法将它们组合在一起,因此只有一个函数适用于两个列表。以下是函数,我想知道更有经验的Haskell编码器是否知道解决方案。
funcOdd :: [Int] -> [Int]
funcOdd [] = []
funcOdd (x:xs) = take (n+1) ((x*2) : (pred n - x):funcOdd(xs)) where n = length xs
funcEven :: [Int] -> [Int]
funcEven [] = []
funcEven (x:xs) = take (n+1) ((x*2) : (n - x):funcEven(xs)) where n = length xs
答案 0 :(得分:1)
您可以将模式匹配分开案例
fullFunction theList | even (length theList) = funcEven theList
fullFunction theList = funcOdd theList
当你致电fullFunction
时,它会尝试第一种情况,检查列表的长度是否均匀。如果失败,它将回退到第二种情况。
答案 1 :(得分:1)
也许这样清洁
func xs = zipWith const (go xs) xs
where go [] = []
go (x:xs) = 2*x : ((length xs)-off-x) : go xs
off = mod (length xs) 2
我在两个函数之间看到的唯一区别是pred n
vs n
的使用,它被替换为从原始列表的长度派生的off(set)。
zipWith const ...
会使用原始列表的长度截断结果以替换take (n+1)
。