Re: [Haskell-fr] Re: inférence
Eric Kow
eric.kow at gmail.com
Thu Sep 13 09:10:35 EDT 2007
On 13/09/2007, Dupont Corentin <corentin.dupont at gmail.com> wrote:
> Personne ne peut me répondre sur mon erreur ci-dessous?
> comment caster de Float en Double?
je ne sais pas... peut-être realToFrac pour faire une conversion?
l'hierarchie des classes dans
http://en.wikibooks.org/wiki/Haskell/Class_declarations
pourrait être pertinent
sinon, tu peux aussi changer tes fonctions pour qu'elles acceptent
Double, ou les généraliser:
blend_un_point :: Float -> (Integer -> Float) -> Integer -> Float
deviendra
blend_un_point :: (Fractional a) => (Integer -> a) -> Integer -> a
J'ignore la difference entre Fractional, Floating, etc
> J'ai d'autres questions:
> Je n'ai pas très bien compris ce que signifie le '.
où? de temps en temps, on utilise x' ou foo' comme nom de variable.
j'aime pas trop parce que je trouve le « ' » pas très visible, mais
d'autres programmeurs ont l'air d'apprecier
> Je ne comprend pas très bien ce que font des opérateurs comme &&&:
j'utilise les dessins dans
http://en.wikibooks.org/wiki/Haskell/Understanding_arrows
pour ça
une utilisation de (&&&) de simplifier (f x, g x) en (f &&& g) x
par abus de typage, on pourrait dire que
(&&&) :: (b -> c) -> (b -> c') -> (b -> (c, c'))
c'est à dire que (&&&) peut prend deux fonctions f et g; et un
paramètre x, il appliquera f et g à x, et renovera le résultat dans un
tuple.
mais en fait, c'est en plus géneral que ça
> (&&&) :: (Arrow a) => a b c -> a b c' -> a b (c, c')
> Dans la signature, que signifient les espaces entre les a,b,c...?
Je sais pas comment ça s'appelle, mais tu as peut-être vu que il exist
des types qui prennent des paramètres. Par exemple Maybe prend un
variable a; donc si je donne Int au type Maybe, j'aurai le type Maybe
Int. Either est un autre exemple, il prend deux parametrès. Ainsi,
Either Int Float est un type. Par fois on écrit des fonctions qui
marche avec des variables de types. Par exemple, la fonction
fromMaybe :: a -> Maybe a -> a
marche pour tous les paramètres qu'on peut donner au type Maybe
Dans Haskell, tu peux écrire qqc encore plus general. Comparons
fromMaybe :: a -> Maybe a -> a
fromBlah :: (Blah x) => a -> x a -> a
fromBlah marche pas seulement avec Maybe, mais avec tous les types «x»
qui sont des instances de la class Blah. De façon similaire,
(&&&) :: a b c -> a b c' -> a b (c,c')
(&&&) marche pour les types «a» qui sont des instances d'Arrow, pas
que pour les fonctions ((->) est un instance de Arrow parmi d'autres)
On peut voir que la signature abusive que j'ai donné est similaire à
la signature ci-dessus en la réecrivant:
(&&&) :: (b -> c) -> (b -> c') -> (b -> (c, c'))
(&&&) :: ((->) b c) -> ((->) b c') -> ((->) b (c, c'))
(&&&) :: ((a) b c) -> ((a) b c') -> ((a) b (c,c')) -- je remplace « ->
» par « a »
(&&&) :: (a b c) -> (a b c') -> (a b (c,c'))
(&&&) :: a b c -> a b c' -> a b (c,c')
Si ça fait un peu bizzare de remplacer « -> » par « a », c'est utile
de se rappeller que les types commes « , » sont des types comme des
autres. C'est juste que là on utilise un opérateur pour le nom du
type (comme on utilise (+) au lieu d'une fonction plus)
Donc on pourrait imaginer...
fst :: (x,y) -> x
fst :: ((,) x y) -> x
fstFoo :: (Foo a) => a x y -> x
Ne fait pas trop confiance à mes propos; je suis loin d'être expert,
et j'ai peut-être dit des bêtisses, ou utilisé des abus de langage
sans savoir.
--
Eric Kow http://www.loria.fr/~kow
PGP Key ID: 08AC04F9 Merci de corriger mon français.
More information about the Haskell-fr
mailing list