Envoyé par
alex_pi
Euh... Tu n'a pas dutout appliqué le même cas "pathologique" en Haskell là, si ?
En fait c'est une confusion des genres, Gorgonite a probablement écrit :
app f xs = (f 2 xs, f 2.0 xs)
qui compile effectivement sans problème. Mais le type de app n'est probablement pas celui auxquel il pensait :
app :: (Fractional a) => (a -> b -> c) -> b -> (c, c)
Haskell ne voit pas le premier 2 comme un entier, mais comme un Fractional, soit un Double soit un Float, puisque f doit aussi être capable de prendre 2.0 comme premier argument.
En OCaml, 2 est un entier, 2.0 est un double.
Maintenant, il est effectivement possible de faire ce à quoi pensait Gorgonite en Haskell, avec une annotation explicite de type :
1 2
| app' :: (forall a. a -> b -> c) -> b -> (c, c)
app' f x = (f () x, f "hello" x) |
(Et en activant le polymorphisme de rang 2)
--
Jedaï
Partager