-
Notifications
You must be signed in to change notification settings - Fork 13
2.1 Taskell: Une implémentation fonctionnelle (fr)
Tamgu offre un véritable formalisme fonctionnel qui fonctionne en parallèle avec le reste du code.
Vous pouvez écrire vos fonctions, vos structures de données et les appeler depuis vos programmes Tamgu.
Taskell est une adaptation relativement fidèle de Haskell à Tamgu.
Tout d'abord, une expression Taskell est toujours entourée de <...>. Vous pouvez facilement et utilement utiliser ces expressions pour écrire des lambdas.
Par exemple, l'opérateur "map" de Taskell applique une opération à un vecteur.
vecteur v = <map (+1)[1..10]> ;
La ligne ci-dessus permet de ranger les valeurs suivantes dans v : [2,3,4,5,6,7,8,9,10,11].
La plupart des opérateurs de Haskell ont été intégrés : filter, take, takeWhile, prendrePendan, fold, scan etc.
Vous pouvez également itérer sur un vecteur externe pour effectuer vos propres opérations :
vecteur v =[1...10] ;
vecteur vv = < x*2 | x x <- v> ;
Vous pouvez également filtrer certaines valeurs:
vecteur v =[1...10] ;
vecteur vv = < x*2 | x x <- v, odd(x)> ;
Dans l'exemple ci-dessus, nous ne conservons et ne calculons que les valeurs impaires.
Une fonction est déclarée comme suit :
<addstr(x,y) = x+y> x+y
Pour typer vos paramètres, vous devez déclarer avant une structure qui décrit ce que la fonction reçoit et ce qu'elle retourne :
<addstr: : string -> string -> string -> string -> string -> string> string
<addstr(x,y) = x+y> x+y
Dans la description ci-dessus, la fonction prend deux chaînes en entrée et retourne une chaîne.
Prenons un exemple :
Nous allons implémenter la fonction : joint qui transforme un vecteur en chaîne.
<joint:: : vector -> string>> string
<joint(v) = x | x <- v>
Taskell accepte également de définir des structures de données ainsi que leurs dérivations et leurs méthodes. Vous trouverez ci-dessous un exemple d'un bout de code qui calcule la bonne surface pour le bon objet :
// -- Nous créons d'abord un objet Shape avec deux dérivations : Cercle et Rectangle
// -- Ils peuvent afficher leur contenu d'où "Show"
<data Shape = Circle float float float |
Rectangle float float float float
deriving (Show)>
// Une surface prend une forme en entrée et retourne un float.
<Surface :: Shape -> float>
<Surface(Circle _ _ r) = 2π×r²> // -- only the radius is useful
<Surface(Rectangle x y xx yy) = abs(xx-x) × abs(yy-y)>
float c=Surface(<Circle 10 20 30>) ; // -- nous calculons la surface pour un cercle
float r=Surface(<Rectangle 20 20 20 40 40 40>) ; // -- nous calculons la surface pour un rectangle