Haskell, проходимое получение значений из Maybe [список] - PullRequest
0 голосов
/ 12 февраля 2019

Обнаружена необходимость использования Traversable.Он возвратил список, подобный этому, генерирует: fReplList = Just [2,4..100].

Я знаю, как вернуть Maybe значение в списке, например: [Just 1, Just 2, Nothing], но я не знаю, как сопоставить с шаблоном Maybe-список вроде: Just [2,4,6,8..100].Я - новичок (все еще) и чувствую себя плохо, я все еще бегаю в этих элементарных проблемах, но возможно Вы можете помочь.

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете сопоставить шаблон с 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.

...