Как я могу вернуть значение 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) .

Другие вопросы по тегам