Comme tu l'as compris, ta première signature était équivalente à "String -> (Maybe Float) -> Float -> Float" car l'application (ici de Maybe) est toujours prioritaire (ici par rapport à l'opérateur ->).
Maintenant ton problème est que tu essaies d'appliquer (operation "+") comme si c'était une fonction mais c'est un Maybe qui contient (éventuellement) une fonction...
Pour l'appliquer, il y a plusieurs possibilités :
Extraire la fonction dans un pattern match :
1 2 3
| case operation "+" of
Just f -> f 2 2
Nothing -> error "opération inconnue" |
ou dans GHCi sur une seule ligne :
case operation "+" of {Just f -> f 2 2; Nothing -> error "opération inconnue"}
Tu peux également utiliser le fait que Maybe est un Functor pour traiter les deux cas de façon transparente :
fmap (\f -> f 2 2) (operation "+")
Attention toutefois, cette fois ci le résultat sera du type "Maybe Float" (Just résultat ou Nothing si l'opération est inconnue).
Ceci peut également s'écrire de la façon suivante avec la monade Maybe :
1 2 3
| do
f <- operation "+"
return (f 2 2) |
La façon dont tu procèdes dépendra de tes besoins (la monade est par exemple parfaite si tu as d'autres source de Maybe, par exemple pour les opérandes, et que tu veux les combiner en obtenant Nothing dès que l'un d'entre eux échoue).
Dernière façon de faire, ici appropriée parce que tu sais que l'opération existe (mais alors pourquoi ne pas utiliser directement (+) ...) mais à éviter en général :
1 2 3
| import Data.Maybe (fromJust)
... (fromJust (operation "+")) 2 2 |
Bonne continuation.
--
Jedaï
Partager