2016-10-11 12 views
6

ブロック行い、私は基本的にCharStringを取り、そのような文字が他の文字列の先頭、又はNothing等しい場合Just (char,tail)を返し、次の機能が見つかりました:ハスケル - 奇妙は<strong>ハスケルWikibook</strong>約<a href="https://en.wikibooks.org/wiki/Haskell/MonadPlus" rel="nofollow">MonadPlus</a>を読んでいる間行動

char :: Char -> String -> Maybe (Char, String) 
char c s = do 
    let (c':s') = s 
    if c == c' then Just (c, s') else Nothing 

と、彼らはそれがパターンが失敗したときNothingに評価されますdoブロック内にある原因let (c':s') = sは、例外を生成しませんが、私はそれをしようとしたときので、それは、そうではないことを説明:

*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 

、それは予想通り...なぜそれが私に起こっている働いていましたか?

+0

トピックオフ:[1]つべこべ:ハスケルウィキ/ =ハスケルWikibook(それは共通の取り違えです)。 [2]本にバグがあった場合は、MonadPlusの章がAMPのために短期間に更新されるので、それを報告するのは非常に適切な瞬間でした。ありがとう! – duplode

+1

@duplodeあなたが言ったように、私はHaskell Wikibookにそれを変更しようとしています – FtheBuilder

+0

@duplode私の無知には申し訳ありませんが、AMPはどういう意味ですか? – FtheBuilder

答えて

7

私はウィキが間違っていると思います。彼らはおそらく、をバインドして、failの機能を使って失敗するという事実とこれを混同している可能性があります。Monadがあります。したがって、次の例では、Nothing戻りMaybeからfail関数を使用します。

char :: Char -> String -> Maybe (Char, String) 
char c s = do 
    (c':s') <- return s 
    if c == c' then Just (c, s') else Nothing 
+1

うん、それは間違いです。おそらく、演者の作者は '< - 'の代わりに 'let'をミスヒットし、8年の間にそれはみんなの指をくぐり抜けました(私も含めました!)。 – duplode

関連する問題