MonadPlusに関するHaskell Wikibookを読んでいるときに、基本的に aと aを取り、そのような char が文字列の head と等しいか、そうでない場合に返す次の関数を見つけました。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
期待どおりに機能しました...なぜそれが私に起こっているのですか?