Читая Викикнигу по Haskell о MonadPlus, я обнаружил следующее. функция, которая в основном принимает Char
и String
и возвращает Just (char,tail)
, если такой символ равен заголовку строки, или Nothing
в противном случае:
char :: Char -> String -> Maybe (Char, String)
char c s = do
let (c':s') = s
if c == c' then Just (c, s') else Nothing
и они объясняют, что let (c':s') = s
не вызовет исключения, потому что он находится в блоке do
, который будет оцениваться как Nothing
, когда шаблон терпит неудачу, но это не так, потому что когда я попробовал это:
*Main> char 'a' ""
*** Exception: exercice2.hs:5:7-17: Irrefutable pattern failed for pattern (c' : s')
Поэтому мне пришлось переписать его на:
char' :: Char -> String -> Maybe (Char, String)
char' _ [] = Nothing
char' c (c':s')
| c == c' = Just (c,s')
| otherwise = Nothing
и это сработало, как и ожидалось... Почему это происходит со мной?
Applicative
надклассомMonad
. Возьмем произвольный пример:guard
, который раньше имел ограничениеMonadPlus
, теперь имеет ограничениеAlternative
. Это означает, что в главе книги, посвященной Monad Transformers, имеется некоторый слегка поврежденный код (который используетguard
в одном примере), и для его правильного исправления потребуется обсуждениеAlternative
в главе MonadPlus. - person duplode   schedule 11.10.2016