在开始Haskell函数时定义一个常量值

时间:2016-04-11 15:39:02

标签: list function haskell permutation

我刚刚开始学习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

2 个答案:

答案 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)