2016-03-02 52 views
3

我想知道是否有一個標準函數迭代一個函數,它返回一個初始值(可能值),收集列表中的值,但是當它到達Nothing時結束列表。該功能例如可以實現像這樣:是否有像迭代這樣的標準Haskell函數可以停止任何操作?

iterateMaybe f a = a : iterMaybe (f a) where 
    iterMaybe Nothing = [] 
    iterMaybe (Just a) = a : iterMaybe (f a) 

或略有不同,像這樣:

無的 the functions that Hoogle finds匹配
iterateMaybe' f Nothing = [] 
iterateMaybe' f (Just a) = a : iterateMaybe' f (f a) 

回答

13

這是unfoldr的特殊情況。

iterateMaybe f = unfoldr (fmap (\s -> (s,s)) . f) 

所不同的是通過unfoldr返回將不包括最初的元素列表。

+1

當然,您可以執行'iterateMaybe f x = x:helper f x',其中'helper'具有在答案中給出的'iterateMaybe'的定義。這給你從最初元素開始的列表。 – amar47shah

相關問題