Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Caml
Caml Forum d'entraide sur la programmation avec les langages fonctionnels Caml-Light et OCaml
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/02/2013, 20h47   #1
n0-sheep
Invité de passage
 
Homme Julien
Étudiant
Inscription : janvier 2013
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2013
Messages : 16
Points : 4
Points : 4
Par défaut Types et polymorphisme (let et fun)

Bonjour à tous,
Je m'attaque à la compréhension de la gestion des types en Caml et voici quelque chose que je ne m'explique pas, peut-être pourrez-vous m'aider à comprendre :

[EDIT]
J'essaie d'obtenir une fonction du type
Code :
1
2
f : ('a -> 'b) -> 'a1 -> 'a2 -> 'b1 * 'b2 = <fun>
[/EDIT]

A priori, je pensais qu'il fallait utiliser un let :

Ici ca marche, j'utilise un let, id a été déclarée au préalable :
Code :
1
2
3
#let fonc' = fun x -> (id x) in fun x y -> (fonc' x, fonc' y);;
- : 'a -> 'b -> 'a * 'b = <fun>
Ici, ca ne marche pas, pourtant j'utilise la même structure au sein de la fonction....
Code :
1
2
3
#let f id = let fonc' = fun x -> (id x) in fun x y -> (fonc' x, fonc' y);;
f : ('a -> 'b) -> 'a -> 'a -> 'b * 'b = <fun>
Merci d'avance
n0-sheep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2013, 22h43   #2
SpiceGuid
Rédacteur
 
Avatar de SpiceGuid
 
Homme Damien Guichard
Inscription : juin 2007
Messages : 1 512
Détails du profil
Informations personnelles :
Nom : Homme Damien Guichard
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : juin 2007
Messages : 1 512
Points : 2 495
Points : 2 495
Par défaut Plus simplement

Et pourquoi pas :

Code Caml :
1
2
# fun x y -> x,y;;
- : 'a -> 'b -> 'a * 'b = <fun>
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo.
Avant de poser une question je lis les règles du forum.
SpiceGuid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2013, 23h04   #3
n0-sheep
Invité de passage
 
Homme Julien
Étudiant
Inscription : janvier 2013
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2013
Messages : 16
Points : 4
Points : 4
Bonjour,
Merci pour votre réponse.

J'ai du mal m'exprimer, il faut dire que le concept n'est pas encore très clair pour moi.
Je voudrais faire ça :
avec ce type :
Code :
1
2
3
f : ('a -> 'b) -> 'a -> 'c -> 'b * 'd = <fun>
ou :
f : ('a -> 'b) -> 'a1 -> 'a2 -> 'b1 * 'b2 = <fun>
(J'ai édité mon premier message pour mieux le préciser)
n0-sheep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 03h52   #4
Ptival
Membre actif
 
Avatar de Ptival
 
Homme Valentin Robert
Étudiant
Inscription : juin 2004
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Valentin Robert
Âge : 24
Localisation : Etats-Unis

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2004
Messages : 70
Points : 172
Points : 172
Code :
f : ('a -> 'b) -> 'a -> 'c -> 'b * 'd
Tu ne peux pas retourner un élément de type 'd si tu ne reçois pas un argument de type 'd ou une fonction qui retourne entre autres un 'd.

Il n'y a donc pas de bonne réponse à ta question : soit tu nous expliques comment tu souhaites utiliser ta fonction ou son but, et on peut te guider, ou bien tu veux vraiment créer une fonction de ce type, et personne ne peut t'aider dans cette quête.

En particulier, ton appel :

semble assez suspicieux. Que doit-il retourner ? Que fait-il d'id en particulier ?
Ptival est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 22/02/2013, 14h06   #5
prgasp77
Membre Expert
 
Avatar de prgasp77
 
Homme Yankel Scialom
Ingénieur en systèmes embarqués
Inscription : juin 2004
Messages : 998
Détails du profil
Informations personnelles :
Nom : Homme Yankel Scialom
Âge : 26
Localisation : France, Eure (Haute Normandie)

Informations professionnelles :
Activité : Ingénieur en systèmes embarqués
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juin 2004
Messages : 998
Points : 1 417
Points : 1 417
Tout à fait, il te faut un moyen de retourner un 'd à partir de 'a et de 'b.

Citation:
Envoyé par Ptival Voir le message
En particulier, ton appel :

semble assez suspicieux. Que doit-il retourner ? Que fait-il d'id en particulier ?
Les parenthèses en moins − f id (2, 2.) − c'est tout de suite plus clair. En OCaml (et en général avec les langages construits sur le modèle de lambda-calcul), il n'y a pas de distinction entre une fonction qui prend deux arguments a et b d'une part, et une fonction qui prend un argument a et retourne une fonction qui prend un argument b d'autre part.

Cdlt,
__________________
gasp in touch
-- Yankel Scialom
prgasp77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 16h59   #6
n0-sheep
Invité de passage
 
Homme Julien
Étudiant
Inscription : janvier 2013
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2013
Messages : 16
Points : 4
Points : 4
Bonjour à tous,
Merci beaucoup pour vos réponses. Voici quelques précisions sur ce que je cherche :

J'ai cette fonction :
Code :
1
2
3
#let func = fun a -> (true, a);;
func : 'a -> bool * 'a = <fun>
J'ai cette autre fonction :
Code :
1
2
3
#let applicator func = fun x y -> (func x, func y);;
applicator : ('a -> 'b) -> 'a -> 'a -> 'b * 'b = <fun>
Donc ceci marche :
Code :
1
2
3
#applicator func 2 3;;
- : (bool * int) * (bool * int) = (true, 2), (true, 3)
Néanmois, la fonction func peut s'appliquer aux int mais aussi au float :
Code :
1
2
3
4
5
#func 1.0;;
- : bool * float = true, 1.0
#func 2;;
- : bool * int = true, 2
Donc je voudrais pouvoir faire ceci sans erreurs :
Code :
1
2
3
4
5
>applicator func 2 1.0;;
>                  ^^
This expression has type float,
but is used with type int.
Pour ça, je remarque que si l'on passe par une forme let, ça fonctionne :
Code :
1
2
3
#let func' = fun x -> (true,x) in fun x y  -> (func' x, func' y);;
- : 'a -> 'b -> (bool * 'a) * (bool * 'b) = <fun>
Ce que je cherche, c'est un moyen de mélanger les deux, un peu a cette manière :
Code :
1
2
3
#let applicator' = let func' = fun x -> (true,x) in fun x y  -> (func' x, func' y);;
applicator' : 'a -> 'b -> (bool * 'a) * (bool * 'b) = <fun>
Par exemple, quelque chose équivalent à ceci :
Code :
1
2
3
#let applicator' func = let func' = fun x -> func x in fun x y  -> (func' x, func' y);;
applicator' : ('a -> 'b) -> 'a -> 'a -> 'b * 'b = <fun>
J'ai alors essayé ceci sans succès :
Code :
1
2
3
let applicator' func = let func1 = fun x -> func x in let func2 = fun y -> func y in fun x y  -> (func1 x, func2 y);;
applicator' : ('a -> 'b) -> 'a -> 'a -> 'b * 'b = <fun>
Mais cette tentative échoue.

voilà donc ce que j'essaie de faire...


Merci à vous
n0-sheep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 17h32   #7
prgasp77
Membre Expert
 
Avatar de prgasp77
 
Homme Yankel Scialom
Ingénieur en systèmes embarqués
Inscription : juin 2004
Messages : 998
Détails du profil
Informations personnelles :
Nom : Homme Yankel Scialom
Âge : 26
Localisation : France, Eure (Haute Normandie)

Informations professionnelles :
Activité : Ingénieur en systèmes embarqués
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juin 2004
Messages : 998
Points : 1 417
Points : 1 417
Je comprends. Ton problème (et sa solution) est décrit ici : Higher-Rank Polymorphism in OCaml [legiasoft.com].
__________________
gasp in touch
-- Yankel Scialom
prgasp77 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/02/2013, 17h34   #8
n0-sheep
Invité de passage
 
Homme Julien
Étudiant
Inscription : janvier 2013
Messages : 16
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2013
Messages : 16
Points : 4
Points : 4
Bonjour,
Merci beaucoup pour la piste de recherche, je vais regarder de ce coté.
n0-sheep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2013, 17h57   #9
SpiceGuid
Rédacteur
 
Avatar de SpiceGuid
 
Homme Damien Guichard
Inscription : juin 2007
Messages : 1 512
Détails du profil
Informations personnelles :
Nom : Homme Damien Guichard
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : juin 2007
Messages : 1 512
Points : 2 495
Points : 2 495
Par défaut Tu dois utiliser 2 fois la même fonction avec des types différents

Code OCaml :
1
2
3
4
5
# let func a = true,a
  and applicator f g x y = f x, g y;;

# applicator func func 2 1.0;;

Ou bien te compliquer la vie avec du Higher-Rank Polymorphism
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo.
Avant de poser une question je lis les règles du forum.
SpiceGuid est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h48.


 
 
 
 
Partenaires

Hébergement Web