Votre erreur ne provient pas d'un malentendu de Maybe
: La signature de type de some
indique qu'il faut une paire (Int, Maybe Int)
, alors que dans votre définition vous lui fournissez deux arguments. La définition devrait donc commencer par some (a,b)
pour correspondre à la signature de type.
Une façon de résoudre le problème (qui est aussi un peu plus idiomatiques et utilise pattern matching) est:
some :: (Int, Maybe Int) -> Int
some (a, Nothing) = a
some (a, Just b) = a + b
Il est également intéressant de noter que si vous avez une très bonne raison d'utiliser un tuple en entrée , vous ne devriez probablement pas le faire. Si votre signature était à la place some :: Int -> Maybe Int -> Int
, vous auriez une fonction de deux arguments, qui peut être curried. Ensuite, vous écririez quelque chose comme
some :: Int -> Maybe Int -> Int
some a Nothing = a
some a (Just b) = a + b
En outre, vous voudrez peut-être ajouter la généralisation immédiate suivante: Tous les types Num
sont additifs, vous pourriez donc faire aswell
some :: (Num n) => n -> Maybe n -> n
some a Nothing = a
some a (Just b) = a + b
(je l'ai violé la pratique courante d'utiliser a, b, c ... pour les variables de type afin de ne pas confondre l'OP puisqu'il lie a
et b
aux arguments de some
).
'some = uncurry $ peut-être 0. (+) ' – Dario
Vous pourriez être intéressé par la question plus générique de la façon de travailler avec un type' Maybe a', [répondu ici] (http: // stackoverflow.com/questions/3375483/opération-sur-un-retour-d'-un-peut-que-contient-juste/3375712 # 3375712). –