Haskell递归函数将不同的函数应用于偶数和奇数索引

时间:2015-12-06 23:31:51

标签: haskell recursion

我一直在努力解决问题。我花了很多时间在互联网上使用递归函数在Haskell中找到一个可行的算法,但没有成功。

定义递归函数funkyMap ::(a - > b) - > (a - > b) - > [a] - > [b]将两个函数f和g以及列表xs作为参数,并将f应用于xs和g中偶数位置([0,2 ...])的所有元素以及奇数位置的所有元素([1,3] ..])在xs。

示例:funkyMap(+10)(+ 100)[1,2,3,4,5] = [(+10)1,(+ 100)2,(+ 10)3,(+ 100)4 ,(+10)5]。

对于上述问题,我尝试了解决方案,但是HUGS给了我编译错误"统一会给出无限类型"。

mapEven :: (a->a) -> [a] -> [a]
mapEven f [] = []
mapEven f (x:xs) = f x : mapOdd f xs

mapOdd :: (a->a) -> [a] -> [a]
mapOdd g [] = []
mapOdd g (x:xs) = x : mapEven g xs

funkyMap :: (a -> b) -> (a -> b) -> [a] -> [b]
funkyMap f g [] = []
funkyMap f g (x:xs) = (mapEven f x) ++ (mapOdd g xs)

请建议其他工作解决方案。

由于

2 个答案:

答案 0 :(得分:2)

这一行存在问题:

funkyMap f g (x:xs) = (mapEven f x) ++ (mapOdd g xs)

x是列表的元素(即类型a),而xs是另一个列表(类型[a])。但你对它们的看法是一样的。你得到的错误是因为理解列表和元素属于同一类型的唯一方法是它是列表列表列表的列表......

答案 1 :(得分:1)

通过上帝的怜悯,我得到了一些灵​​感,我似乎已经破解了这个问题。 请查看以下解决方案:

h1 p q [] = []
h1 p q ((cnt, val) : xs) = (if odd cnt then (q val) else (p val) ) : h1 p q xs

funkyMap f g xs = h1 f g ( zip [0..] xs)

如果我尝试funkyMap(+10)(+ 100)[1,2,3,4,5],我得到的是[11,102,13,104,15]。

funkyMap(+100)(+ 2)[1]给出 [101]

和funkyMap(+100)(+ 2)[]给出 []

请查看此解决方案,并告诉我您的反馈意见。

由于