5

MonadPlusに関するHaskell Wikibookを読んでいるときに、基本的に aと aを取り、そのような char が文字列の head と等しいか、そうでない場合に返す次の関数を見つけました。CharStringJust (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ため、例外は生成されないと説明されていますが、そうではありません。doNothing

*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

期待どおりに機能しました...なぜそれが私に起こっているのですか?

4

1 に答える 1

7

ウィキが間違っていると思います。彼らはおそらくこれを、関数 aによってバインドが失敗するという事実と混同しています。したがって、次の例ではを返す関数 from使用します。failMonadfailMaybeNothing

char :: Char -> String -> Maybe (Char, String)
char c s = do
  (c':s') <- return s
  if c == c' then Just (c, s') else Nothing
于 2016-10-11T01:15:15.903 に答える