2010-08-22 16 views
0

Cette petite fonction vérifie la validité d'une chaîne Brainfuck (finie). Il vérifie si le [ et ] sont équilibrés. Le code est très simple et écrit à être récursive:Pourquoi GHC se plaint-elle d'un mauvais type?

-- checks Brainfuck for validity. 
validateBrainfuck :: Monad m => String -> m String 
validateBrainfuck s = maybe (return s) (fail . fromJust) (validate s 0) where 
    validate :: String -> Int -> Maybe String -- Here inversed: String means error 
    validate (']':_) 0 = Just "Too many closing brackets" 
    validate (']':xs) c = validate xs (pred c) 
    validate ('[':xs) c = validate xs (succ c) 
    validate (x :xs) c = validate xs  c 
    validate []  0 = Nothing 
    validate []  _ = Just "Too many opening brackets" 

Maintenant, GHC se plaint de problèmes de frappe:

Brainfuck.hs:62:58: 
    Couldn't match expected type `Maybe String' 
      against inferred type `[Char]' 
     Expected type: Maybe (Maybe String) 
     Inferred type: Maybe String 
    In the third argument of `maybe', namely `(validate s 0)' 
    In the expression: 
     maybe (return s) (fail . fromJust) (validate s 0) 

Peut-être que je suis trop bête pour comprendre ce qui a mal tourné, mais Cela a l'air très bizarre pour moi.

+0

aussi, que diriez-vous 'Soit String()' comme la signature de type? Alors vous n'inversez pas la sémantique bien définie. En outre, Soit est une Monade (bien, sorte de ... voir 'Control.Monad.Error'), de sorte que vous n'avez même pas besoin d'échouer. – jrockway

+0

Je souhaite que la signature de type soit aussi universelle que possible. Alors j'ai fait ça. – fuz

Répondre

5

Regardez le type de maybe et de penser ce qu'il doit faire:

maybe :: b -> (a -> b) -> Maybe a -> b 

Si la valeur peut-être ne contient pas de résultat (à savoir Nothing), maybe renvoie l'argument b.

Sinon - quand Just a est donnée - il applique la fonction donnée au résultat valide. Nous n'avons pas besoin d'une extraction fromJust ici.

Votre code devient juste

maybe (return s) fail (validate s 0) 
+0

Vous avez raison. (Quelle question nooby) ... honte à moi. – fuz