Вы можете сопоставить шаблон с Maybe [Int]
точно так же, как вы сопоставляете шаблон с любым Maybe a
:
foo (Just x) = x
foo Nothing = -- ?
Вопрос: что вы возвращаете в случае Nothing? (Для ясности, приведенный выше фрагмент кода не компилируется, потому что foo
ничего не возвращает в случае Nothing
.)
Иногда вы можете решить что-то сделать с x
внутри Just
, а затем поместите результат обратно в Just
case:
map' f (Just x) = Just (f x)
map' _ Nothing = Nothing
Это именно то, что fmap
уже делает для Maybe a
, поэтому я назвал примерфункция map'
.С помощью fmap
вы можете отобразить Maybe [Int]
следующим образом:
Prelude> fmap show (Just [2,4,6,8,100])
Just "[2,4,6,8,100]"
Обратите внимание, что это превращает весь список в String
, потому что fmap
относится к Maybe
, а не к []
.
Хотя в общем случае трудно сказать, что возвращать в случае Nothing
, для списков (и других моноидов) существует естественное «значение по умолчанию».Так, специально для Maybe [a]
, вы могли бы написать что-то вроде этого:
maybeListToList :: Maybe [a] -> [a]
maybeListToList (Just xs) = xs
maybeListToList Nothing = []
Использование может выглядеть следующим образом:
*Q54645038> maybeListToList (Just [2,4,6,8,100])
[2,4,6,8,100]
*Q54645038> maybeListToList Nothing
[]
Это на самом деле не нужно, потому что вы могли бывместо этого объедините существующие функции из Data.Maybe
и стандартного Prelude
, чтобы получить те же функции:
Prelude Data.Maybe> maybeToList (Just [2,4,6,8,100])
[[2,4,6,8,100]]
Prelude Data.Maybe> concat (maybeToList (Just [2,4,6,8,100]))
[2,4,6,8,100]
Prelude Data.Maybe> concat (maybeToList Nothing)
[]
Обратите внимание, как maybeToList
превращает любой Maybe a
в список.Когда a
уже является списком, вы получаете вложенный список, который затем можно сгладить с помощью concat
.