Прежде всего, я новичок в Haskell, поэтому, если я задаю несколько глупый вопрос, пожалуйста, скажите мне, как я могу сделать лучше. Спасибо:)
Моя задача - получить список строк, соответствующих определенным условиям. Если никакие строки не соответствуют, я хотел бы оценить до Nothing
. Поэтому я пишу две функции:
isSpecialLine :: String -> String -> Maybe Bool
isSpecialLine t s = Just $ (("[" ++ t ++ ":") `isPrefixOf` s) && ("]::" `isSuffixOf` s)
getLinesWith :: String -> String -> Maybe [String]
getLinesWith t = filterM (isSpecialLine t) . lines
Этот код работает, но я считаю, что Maybe Bool
выглядит немного странно. Эй, это двоичный файл! Это всегда True
или False
, поэтому значение isSpecialLine
всегда будет Just True
или Just False
. В моем случае это не может быть Nothing
!
Но если я изменю тип вывода isSpecialLine
на Bool
, появится следующая проблема: filterM
ожидает Maybe Bool
вместо Bool
.
Хорошо, я делаю это:
getLinesWith :: String -> String -> Maybe [String]
getLinesWith t = filterM (Just $ isSpecialLine t) . lines
Теперь компилятор жалуется на несовпадающий тип: Maybe (String -> Bool)
не соответствует ожидаемому String -> Maybe Bool
. Хорошо, довольно разумно. Итак, я:
getLinesWith :: String -> String -> Maybe [String]
getLinesWith t = Just $ filter (isSpecialLine t) . lines
И снова несоответствие типов, на этот раз Maybe (String -> [String])
не String -> Maybe [String]
. Какой правильный синтаксис для переноса монады [String]
в Maybe
?