Сведение списка элементов Maybe от Just [[x1], [x2]] к Just [x1, x2] - PullRequest
4 голосов
/ 29 апреля 2019

У меня есть функция, которую я должен определить так:

func :: (a -> Maybe [b]) -> [a] -> Maybe [b]

Некоторые примеры того, как это должно работать:

func (\x -> if x == 0 then Nothing else Just [x]) [1,2]

Должно привести к:

Просто [1,2]

Другой пример:

func (\x -> if x == 0 then Nothing else Just [x]) [1,0]

Ничего

Если в списке что-то есть Nothing, то функция возвращает Nothing. В противном случае, если все элементы в списке возвращают Just [x], то он должен вернуть список вроде: Just [x1, x2, ...].

Я попытался использовать fmap для аналогичных звонков, приведенных выше, который возвращает что-то вроде:

[Просто [1], Просто [2], ...]

Если я использую sequence в списке fmap возвратов, он будет следовать приведенным выше правилам (возвращая Nothing, если в списке есть Nothing), и это здорово. За исключением того, что возвращает список, подобный этому:

Просто [[1], [2]]

это не тот формат, который мне нужен. В таком случае мне нужно, чтобы это было:

Просто [1,2]

Поскольку я только начал изучать Хаскель, и монады для меня все еще свежая тема, у меня возникли некоторые проблемы с выяснением, как отформатировать этот список или есть ли лучший способ решения этой проблемы. Я не могу изменить сигнатуру типа функции.

1 Ответ

9 голосов
/ 29 апреля 2019

Чтобы превратить список типа [[1],[2]] в [1,2], используйте concat. В вашем случае, поскольку список находится внутри Maybe, вам нужно вызвать fmap concat для него.

Также обратите внимание, что каждый раз, когда вы вызываете sequence (или sequenceA) по результату map, fmap или <$>, вы можете сохранить функцию, объединив оба в mapM ( или traverse).

...