2017-10-21 51 views
1

我試圖使用遞歸和高階函數做一些事情到列表的第一個元素,然後向列表中的所有其他元素,因此,例如增加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 
+1

的可能的複製[哈斯克爾:雙列表中的每第二個元素(https://stackoverflow.com/questions/17383169/haskell-double-every-2nd-element-in-list) – cdk

回答

4

單一元素情況下,也應該返回一個列表(類型[b]):

applyToEveryOther f [x] = [f x] 
+0

謝謝你,那工作! –

+0

如果我對此有另一個問題..如果我想要保留整個列表,不僅保留那些已經改變的列表,我將如何去做這件事。我是新來的,不知道我是否做了一個新的職位 –

+0

@loutej絕對是一個新的職位! (我認爲答案是'f x:y:applyToEveryOther f xs',但它會被格式化得更好,對其他人更有用,因爲它是一個新的帖子)。 –

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的飼料使用zipWith ($)appeared recently溶液沿的問題。)

(我自己的劣解被使用在Control.Applicative發現ZipList型構造,在這裏應用,它會看起來像

import Control.Applicative 

applyToEveryOther f xs = let fs = cycle [f,id] 
          in getZipList (ZipList fs <*> ZipList xs)