Стандартная функция Haskell :: (a -> возможно a) -> a -> [a]

У меня определена функция

maybeToList :: (a -> Maybe a) -> a -> [a]
maybeToList f x = x : maybe [] (maybeToList f) (f x)

Эта функция кажется настолько очевидной, что я не могу поверить, что она не является стандартной. Определен ли он в каком-то модуле (я уже проверил Data.Maybe)?


person walpen    schedule 06.12.2012    source источник
comment
maybeToList не лучшее имя, учитывая, что в Data.Maybe уже есть функция с таким именем, а именно maybeToList = maybe [] (:[]). unfoldStream или что-то еще?   -  person luqui    schedule 06.12.2012


Ответы (1)


Вашей функции нет в стандартных библиотеках, потому что это специализированная форма тот, который:

unfoldr      :: (b -> Maybe (a, b)) -> b -> [a]
unfoldr f b  =
  case f b of
   Just (a,new_b) -> a : unfoldr f new_b
   Nothing        -> []

Тем не менее, случай, когда элементы списка совпадают с последовательностью начальных значений, является распространенным явлением, и неуклюже писать с точки зрения только unfoldr и других стандартных функций, поэтому я не уверен, почему этого нет в стандартных библиотеках, как Что ж.

person C. A. McCann    schedule 06.12.2012
comment
Спасибо, чувак, хотя я думаю, что было бы понятнее определить функцию, чем писать unfoldr (join (,) . foo) :p. - person walpen; 06.12.2012