Skip to content

2.1 Taskell: Une implémentation fonctionnelle (fr)

Claude Roux edited this page Oct 19, 2022 · 2 revisions

Tamgu est un véritable langage fonctionnel

English Version

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

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.

Itérer

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> ;

Contrôle

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.

Fonctions

Une fonction est déclarée comme suit :

<addstr(x,y) = x+y> x+y

Typage

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>

Structures de données

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π×> // -- 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
Clone this wiki locally