2016-10-11 2 views
6

En lisant le Haskell Wikibook à propos MonadPlus, j'ai trouvé la fonction suivante qui prend essentiellement un Char et un String et retourne Just (char,tail) si un tel caractère est égale à la tête de chaîne, ou Nothing autrement:Haskell - Étrange faire bloquer le comportement

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

et ils expliquent que let (c':s') = s ne produira pas une exception, car il est dans un bloc do qui évaluerait à Nothing lorsque le motif échoue, mais ce n'est pas le cas, parce que quand je l'ai essayé:

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

j'avais donc de réécrire à:

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

et cela a fonctionné comme prévu ... Pourquoi est-il me passe?

+0

Hors sujet: [1] tatillonne: Haskell Wiki/= Haskell Wikibook (il est un méli-mélo commun). [2] S'il y avait effectivement un bug dans le livre, c'était un moment très approprié pour le signaler, car le chapitre MonadPlus sera mis à jour pour l'AMP dans un court laps de temps. Merci! – duplode

+1

@duplode Ok, je vais le changer en Haskell Wikibook comme vous l'avez dit – FtheBuilder

+0

@duplode Désolé pour mon ignorance, mais que signifie AMP? – FtheBuilder

Répondre

7

Je pense que le wiki est faux. Ils sont probablement confondre avec le fait que lie échouer via la fonction fail un Monad offre. Ainsi, l'exemple suivant va utiliser la fonction fail de Maybe, qui retourne Nothing:

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

Ouais, c'est faux en effet. Très probablement, l'auteur de l'exercice a mal orthographié 'let' au lieu de' <-', et dans les huit années qui ont suivi, il a glissé entre les doigts de tout le monde (y compris moi-même!). – duplode