У меня есть функция, которую я должен определить так:
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]
Поскольку я только начал изучать Хаскель, и монады для меня все еще свежая тема, у меня возникли некоторые проблемы с выяснением, как отформатировать этот список или есть ли лучший способ решения этой проблемы. Я не могу изменить сигнатуру типа функции.