Bonjour,
La signature inférée par GHC est :
quadratic :: (Ord a, Floating a) => a -> a -> a -> [a]
C'est le cas parce que :
- tu utilises un opérateur de comparaison sur une valeur du type a ;
- tu utilises l'opérateur de division sur une valeur de type a.
Le problème, c'est que lorsque tu écris :
quadratic :: (Num a) => a -> a -> a -> [a]
ou
quadratic :: (Floating a) => a -> a -> a -> [a]
Aucune de ces deux signatures ne garantit qu'il existe un ordre sur a.
---
Par la suite, je ne comprends pas vraiment ce qui t'importune.
Le fait qu'il n'y ait pas un nom pour "un type qui est à la fois Floating et Ord" ?
Cela me semble plutôt raisonnable, puisque donner un nom à chaque combinaison serait exponentiel (et les noms deviendraient définitivement ridicules).
Le fait qu'il soit dur d'écrire une signature de type par soi-même ? C'est justement pour ça que l'inférence de type est appréciable, tu demandes simplement à GHC d'inférer pour toi le type le plus général. Comme tu l'as fait. La plupart des éditeurs te permettent même d'écrire cette signature inférée pour toi au bon endroit.
Mais sinon, oui c'est assez ennuyant de deviner soi-même un type général pour un terme.
Partager