Как я могу вернуть значение Maybe из нотации do в PureScript?
Я пытаюсь вернуть значение Maybe из функции, использующей нотацию do, но не могу заставить ее работать. Эта функция принимает строку ("имя файла") и путь для поиска в...
findIn :: String -> Path -> Maybe Path
findIn search start = do
file <- ls start
if ((filename file) == search)
then Just file
else Nothing
Куда...
ls :: Path -> Array Path
filename :: Path -> String
Но я продолжаю получать сообщение об ошибке "Число не соответствует массиву типов с типом Maybe", поэтому похоже, что компилятор ожидает, что нотация do вернет массив. Как бы я вернуть значение возможно?
2 ответа
Вы не можете смешивать монады таким образом.
Когда вы пишете:
file <- ls start
это как сказать "для каждого значения file
в массиве...", поэтому вы находитесь в контексте нескольких возможных значений.
Но тогда остальная часть кода находится в контексте Maybe
, который может обрабатывать только одно (или ноль) значение.
В модуле Data.Foldable
E сть find
функция, выполняющая основную часть работы вашей основной функции, путем поиска одного элемента, соответствующего некоторым критериям. Его фактический тип является более общим, но когда он ограничен массивами, он выглядит так:
find :: forall a. (a -> Boolean) -> Array a -> Maybe a
Тогда вы можете просто написать:
findIn search start = find (\x => x == search) $ ls start
Хорошо, я нашел что-то, что работает, но я не уверен, что это идеально.
findIn :: String -> Path -> Maybe Path
findIn search start = if (length r == 1)
then head r
else Nothing
where
r = do
file <- ls start
guard $ (filename file) == search
[file]
Таким образом, похоже, что do-notation возвращает значение типа Array(Maybe Path) .