2016-10-11 3 views
6

Während die Haskell Wikibook Lesen über MonadPlus, fand ich die Funktion nach, die im Grunde eine Char und String nimmt und Just (char,tail) wenn solche Zeichen der Zeichenfolge Kopf gleich oder Nothing anders:Haskell - Strange tun Verhalten blockieren

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

und sie erklären, dass let (c':s') = s keine Ausnahme erzeugen, weil es in einem do Block ist, den Nothing bewerten würde, wenn das Muster nicht, aber das ist nicht der Fall, denn wenn ich es versucht:

*Main> char 'a' "" 
*** Exception: exercice2.hs:5:7-17: Irrefutable pattern failed for pattern (c' : s') 

Also musste ich es neu zu schreiben:

char' :: Char -> String -> Maybe (Char, String) 
char' _ [] = Nothing 
char' c (c':s') 
    | c == c' = Just (c,s') 
    | otherwise = Nothing 

und es funktionierte wie erwartet ... Warum ist es mir passiert?

+0

Off Thema: [1] Erbsenzählerei: Haskell Wiki/= Haskell Wikibook (es ist ein gemeinsames Mix-up). [2] Wenn es tatsächlich einen Bug im Buch gibt, war es ein sehr geeigneter Moment, dies zu melden, da das MonadPlus-Kapitel für den AMP in Kürze aktualisiert wird. Vielen Dank! – duplode

+1

@duplode Ok, ich werde es in Haskell Wikibook ändern, wie du gesagt hast – FtheBuilder

+0

@duplode Entschuldigung für meine Ignoranz, aber was bedeutet AMP? – FtheBuilder

Antwort

7

Ich denke, das Wiki ist falsch. Sie verwechseln das vermutlich mit der Tatsache, dass über die fail Funktion failt, die eine Monad ermöglicht. So wird das folgende Beispiel wird verwenden, um die fail Funktion von Maybe, die Nothing zurück:

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

Yup, es ist in der Tat falsch. Wahrscheinlich hat der Autor der Übung "Let" statt "<-'' vertippt, und in den dazwischen liegenden acht Jahren ist er allen durch die Finger gerutscht (mich selbst eingeschlossen!). – duplode