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.
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
Je souhaite que la signature de type soit aussi universelle que possible. Alors j'ai fait ça. – fuz