递归函数中的非详尽模式错误

时间:2017-10-21 03:42:35

标签: list haskell recursion

我正在尝试使用递归和高阶函数对列表的第一个元素执行某些操作,然后对列表中的每个其他元素执行某些操作,例如将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

2 个答案:

答案 0 :(得分:4)

单个元素大小写还应返回List(类型为[b]):

applyToEveryOther f [x] = [f x]

答案 1 :(得分:1)

另一种不使用显式递归的解决方案,只是高阶函数:

import Data.List (cycle)

applyToEveryOther f = zipWith ($) (cycle [f, id])

cycle创建了无限的交替函数列表fidfid等。

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)