我正在尝试使用递归和高阶函数对列表的第一个元素执行某些操作,然后对列表中的每个其他元素执行某些操作,例如将3添加到第1个,第3个,第5个等等。
我遇到的问题是它给了我non-exhaustive pattern
错误。任何帮助,将不胜感激。以下是我到目前为止的情况:
applyToEveryOther :: (a -> b) -> [a] -> [b]
applyToEveryOther _ [] = []
applyToEveryOther f (x:y:xs) = f x : applyToEveryOther f xs
这些是我尝试但没有帮助的其他一些行:
applyToEveryOther _ [x] = f x
applyToEveryOther f [x] = f x
答案 0 :(得分:4)
单个元素大小写还应返回List(类型为[b]
):
applyToEveryOther f [x] = [f x]
答案 1 :(得分:1)
另一种不使用显式递归的解决方案,只是高阶函数:
import Data.List (cycle)
applyToEveryOther f = zipWith ($) (cycle [f, id])
cycle
创建了无限的交替函数列表f
,id
,f
,id
等。
zipWith ($)
将列表中的函数应用于输入列表的相应元素。
[(+1), id, (+1), id, (+1), id, (+1), id, ...]
[ 1, 2, 3, 4, 5, 6, 7, 8 ]
=============================================
[ 2, 2, 4, 4, 6, 6, 8, 8 ]
(帽子提示:将问题列表分段应用于参数列表的问题,以及在1HaskellADay twitter feed上使用zipWith ($)
,appeared recently的解决方案。)
(我自己的劣等解决方案是使用ZipList
中的Control.Applicative
类型构造函数;在这里应用,它看起来像
import Control.Applicative
applyToEveryOther f xs = let fs = cycle [f,id]
in getZipList (ZipList fs <*> ZipList xs)
)