Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > F#
F# Forum d'entraide sur la programmation en langage fonctionnel F#
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 15/02/2011, 00h48   #1
golden boy
Membre confirmé
 
Avatar de golden boy
 
Homme
Étudiant
Inscription : novembre 2010
Messages : 120
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 120
Points : 224
Points : 224
Par défaut Définition d'une fonction

Bonsoir,

Je cherche à faire une fonction qui doit me donner la ou les solutions d'un polynôme du second degré (ax² + bx + c).

Pour l'instant, voici ma fonction (elle fonctionne très bien) :

Code :
1
2
3
4
5
6
7
let polynome a b c =
    let delta = b ** 2. - 4. * a * c
    (-b - sqrt(delta)) / (2. * a),
    (-b + sqrt(delta)) / (2. * a)

let phi = polynome -1. 1. 1.
Code coloré ici

Quand je lance ça dans interpréteur, j'ai bien mon couple de solutions qui apparait.


Seulement voilà, j'aimerais aller plus loin et faire en sorte qu'un couple ne soit retourné que si delta > 0 et qu'un nombre seul soit retourné seulement si delta = 0 et enfin, qu'un complexe soit retourné si delta < 0;

Je code donc ma fonction ainsi mais cela ne semble pas fonctionner :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let polynome a b c =
    let delta = b ** 2. - 4. * a * c

    if delta > 0. then
    (-b - sqrt(delta)) / (2. * a),
    (-b + sqrt(delta)) / (2. * a)

    elif delta = 0. then
    (-b) / (2. * a)

    else
    (-b - sqrt(abs(delta))) / (2. * a),
    (-b + sqrt(abs(delta))) / (2. * a)


let phi = polynome -1. 1. 1.
Ou ici

Je pense savoir d'où vient l'erreur : si mon premier 'if' retourne un tuple de float, alors mes autres 'elif' et 'else' doivent aussi retourner un tuple de float.


Y a t-il un moyen de remédier à ce problème ?

Merci d'avance.
golden boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 01h50   #2
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 962
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 962
Points : 1 148
Points : 1 148
Quel serait le type de phi ? Comment l'utiliserais-tu ensuite ?
C'est le problème dans tous les langages à typage statique : le compilateur veut connaître les types que tu manipules (et sans exécuter ton code). Il faut que chaque valeur ait un seul type.

Une solution possible est de renvoyer une liste de nombre complexes. La liste peut avoir 1 ou 2 éléments, dont la partie imaginaire sera nulle pour delta>=0.

Une autre solution est de définir un type somme et de l'utiliser comme valeur de retour :

Code :
1
2
3
4
type Solutions =
  | Real1 of float
  | Real2 of float * float
  | Complex2 of Complex * Complex
On peut trouver d'autres représentations, ça dépend essentiellement de comment tu veux manipuler ta valeur de retour ensuite.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/02/2011, 00h16   #3
golden boy
Membre confirmé
 
Avatar de golden boy
 
Homme
Étudiant
Inscription : novembre 2010
Messages : 120
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 120
Points : 224
Points : 224
Bonsoir, merci de votre réponse.

Le type somme semble en effet être une solution adaptée, je n'y avais pas pensé car je ne connaissais pas encore ce type.
Merci, je vais donc essayer de re-coder ma fonction
golden boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h45.


 
 
 
 
Partenaires

Hébergement Web