2016-03-02 5 views
3

Мне интересно, существует ли стандартная функция, которая выполняет итерацию функции, которая возвращает значение (возможно значение) над начальным значением, собирая значения в списке, но заканчивая список, когда он получает значение Nothing. Эта функция может быть реализована, например, так:Есть ли стандартная функция Haskell, такая как итерация, которая останавливается на Nothing?

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

или немного по-другому, как так:

iterateMaybe' f Nothing = [] 
iterateMaybe' f (Just a) = a : iterateMaybe' f (f a) 

Ни один the functions that Hoogle finds матч.

ответ

13

Это специальный случай unfoldr.

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

Разница в список возвращаемый unfoldr не будет включать в себя начальный элемент.

+1

И, конечно, вы можете выполнить 'iterateMaybe f x = x: helper f x', где' helper' имеет определение 'iterateMaybe', указанное в ответе. Это дает вам список, начинающийся с исходного элемента. – amar47shah

 Смежные вопросы

  • Нет связанных вопросов^_^