Haskell - Les bases

27 views
Skip to first unread message

Albert

unread,
Feb 11, 2014, 11:31:10 AM2/11/14
to nant...@googlegroups.com
Bonjour,
C'est en se cognant ce genre de problème que je me dis qu'il me reste encore énormément de chemin avec Haskell :-/

Question : pourquoi dans le code suivant, la signature de f' n'est pas la même que celle de f ? Ce qui me déroute le plus c'est que f' définie comme let f ' = (\x y -> x==y) et l'expression (\x y -> x==y) n'ont pas le même type. Je me serais attendu qu'une variable ait le même type que l'expression qui la définit.
Question bonus : qu'est-ce que le type () ?

>let f x y = (x==y)
>:t f
f :: Eq a => a -> a -> Bool
>f 1 1
True
> f 'a' 'z'
False

> let f' = (\x y -> x == y)
> :t f'
f' :: () -> () -> Bool
> f' 1 1
<interactive>:8:4:
    No instance for (Num ()) arising from the literal `1'
    Possible fix: add an instance declaration for (Num ())
    In the first argument of f', namely `1'
    In the expression: f' 1 1
    In an equation for `it': it = f' 1 1

> f' 'a' 'z'
<interactive>:9:4:
    Couldn't match expected type `()' with actual type `Char'
    In the first argument of f', namely 'a'
    In the expression: f' 'a' 'z'
    In an equation for `it': it = f' 'a' 'z'

<interactive>:9:8:
    Couldn't match expected type `()' with actual type `Char'
    In the second argument of f', namely 'z'
    In the expression: f' 'a' 'z'
    In an equation for `it': it = f' 'a' 'z'


> :t (\x y -> x==y)
(\x y -> x==y) :: Eq a => a -> a -> Bool
> (\x y -> x==y) 1 1
True
> (\x y -> x==y) 'a' 'z'
False

Mog

unread,
Feb 11, 2014, 12:12:20 PM2/11/14
to nant...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hello Albert,

http://www.haskell.org/haskellwiki/Monomorphism_restriction

Au lieu de planter, ça tourne parce qu'ici GHCi donne un type par
défaut (unit) à ton instance de Eq (c'est comme avec les nombres où
GHCi type beaucoup de choses par défaut) mais en théorie y a pas le
droit de le faire.
> -- Vous recevez ce message, car vous êtes abonné au groupe Google
> Groupes Nantes FP. Pour vous désabonner de ce groupe et ne plus
> recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse
> nantes-fp+...@googlegroups.com. Pour envoyer un message à
> ce groupe, adressez un e-mail à nant...@googlegroups.com. Visitez
> ce groupe à l'adresse http://groups.google.com/group/nantes-fp .
> Pour plus d'options, visitez le site
> https://groups.google.com/groups/opt_out .

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQIcBAEBAgAGBQJS+lnuAAoJEA01eIZNq72oYsgQAL0HqFeCGPtHxEgKuzRPFpAj
5c+aZdc6ARrmltvJXV8AxBpHovnXovjOPdKzlm0Dsv6FWKz8BJuhh4nTexhfFBzb
Wm4dXMVmd5TRzvz9Vxb6/0ntqXJ6MZ1VZ73Y3iissKmldWdVzUC3xe1w6zJkZEvb
f+2c+c4J8ANs5fjWaPVzGQ6N4KYF8FJl4eL3G+pCKClceAlxGtNfUBmsQGYSZXt3
neeqSaFBhtUFlcHBU2pTiCfXNwObg6RjUoXXvBJbNKXQZ4zfh7by7KflRonxDz9j
flMrCt+f0eZo1VtZODYdV8q/w8GhM0Yxdn/0GYdPSYRhDtftszdyUm3wGS+WxoWl
bbazUd9tSZUfuYCCdXvtQ9Pf8T3baF3CQ6pCTp3ewlYeEo1X/b8Wp6Xexrbs/2nx
AsIjvPG0ioUiBxCe+Jv2kDbZIhhUe1QfO54g3mZr21FhrJ6xglO+SYeC/Axyq6Eo
Xdbo/Ghh2e11/rMh1I33VCR8qIte0o/vf7x9desLQcl5n7ePUrl5sjPajx9K8htn
iJTOd/lWInG641m9QFC6fgCc3IBohRpFbMWQSCNPrkZ9rrrrmevnrhRyIM4ybkq/
7RfZJHqshvir3ubW5/1nQb4pFcq67k9Yqi4y+vVmgdH61CjkvggOTalEy3y4mDvA
X/Sp2HhBF53UIwOFPzRQ
=+s1y
-----END PGP SIGNATURE-----

Mog

unread,
Feb 11, 2014, 12:15:49 PM2/11/14
to nant...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Ah oui et pour répondre plus explicitement à ta question bonus, le
type unit représente souvent dans les langages fonctionnels le type
qu'on donne quand il n'y a pas de valeur à retourner, souvent parce
que la fonction fait de l'IO. C'est un peu l'équivalent des fonctions
void en Java, C et consorts.

https://en.wikipedia.org/wiki/Unit_type

On 02/11/2014 05:31 PM, Albert wrote:
> -- Vous recevez ce message, car vous êtes abonné au groupe Google
> Groupes Nantes FP. Pour vous désabonner de ce groupe et ne plus
> recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse
> nantes-fp+...@googlegroups.com. Pour envoyer un message à
> ce groupe, adressez un e-mail à nant...@googlegroups.com. Visitez
> ce groupe à l'adresse http://groups.google.com/group/nantes-fp .
> Pour plus d'options, visitez le site
> https://groups.google.com/groups/opt_out .

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQIcBAEBAgAGBQJS+lrFAAoJEA01eIZNq72oJJUP/jTZVlqBKjvfMqCeN/+iX/RI
/S5QkSHcCci7QuZH+iihewiGqWI1neZuX71noxBmPSBLtNmTSR9ZcrSaaLScOw/B
A1fAbpsfvuO1oHjtDB75GNPeEa2mCv458Fa9mC7v3E7fMFGGaeE3lEjjMIEeC36Y
86Y09Dwny34+FZiLdmIyQNPB4P1rcWxJjbaTAkve1eM2o9eW2TGJfnZBauOsnysb
dmKWy7jNpK6x9VPivZdSmiNqYoUl4cAK138RDeM2g4YorB9Pn3w5xlEKt5/H5b24
EjfXwg1bNlmafmj4nnStF3LP6SEPIXQ/c7S/+ti2Uc7D+W3YPZBURghMt5IlEJy7
/rNV8HqgEPhiAcf9bRd9oQK8fs5QaeXk9zHhUPd54K8U06Dd/KM/6Bcnpxg6slE2
jroYDd7bAldOi6PfSb9dM8uMW/baSXRCJ3Ah0PhZr+D0FBeMTydRq5CmNPTpePQE
EsdIayo5FoyT3OoMTG8iKYB1UIG/2XcarWXcm2yR09H8UZJlVaMiaaaLEDW5uGK2
ohZAAECjLa4/6UMVl+krJkuMqX4jF2EbHM61Hxl9aB1WrE/pG+1trvnOOUNxUNLW
UJoZl76qFD4pYl3YdgOeztbab80gn34ga3YX6YSt36iJSMhydY4x+msuGv09sbmM
fCYv8U+d65xa6FsA5tzY
=xqvd
-----END PGP SIGNATURE-----

Clement Delafargue

unread,
Feb 11, 2014, 12:18:38 PM2/11/14
to nant...@googlegroups.com
Pour la deuxième question :
() (on dit unit) c'est le type unitaire. C'est à dire le type qui n'a qu'une seule valeur (on dit *le* type unit car tout type n'ayant qu'une seule valeur est trivalement équivalent à ()).

Comme le dit mog, un équivalent courant dans des langages moins propres, c'est void. Avoir un type dédié c'est plus cohérent avec le reste du langage et ça ne fait pas chier quand on part dans les génériques (java a void et Void à cause des génériques).

Cordialement,
Clément Delafargue
cle...@delafargue.name
http://www.eklaweb.com

PGP Fingerprint : 5311 A6C4 8416 5378 3019  B977 FFB4 9299 EAE0 ED53

Albert

unread,
Feb 12, 2014, 3:13:17 AM2/12/14
to nant...@googlegroups.com
Salut,

Merci pour les explications et pour le lien. C'est rassurant de lire  "the most annoying and controversial feature". Si je comprends bien, les raisons sont purement de l'optimisation comme dans le cas donné en exemple où le second élément de la pair doit être réévalué à cause du polymorphisme sur le type de retour.
Pour (), inattention et oubli de ma part !! C'est vrai que je savais qu'il s'agissait du type unitaire.


De: "Clement Delafargue" <cle...@delafargue.name>
À: nant...@googlegroups.com
Envoyé: Mardi 11 Février 2014 18:18:38
Objet: Re: Haskell - Les bases
Reply all
Reply to author
Forward
0 new messages