12.07.2015 Views

Algorithmes de la morphologie mathématique pour - Pastel - HAL

Algorithmes de la morphologie mathématique pour - Pastel - HAL

Algorithmes de la morphologie mathématique pour - Pastel - HAL

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Jaromír BRAMBOR4.2. HASKELL ET LES BASES DES LANGAGES FONCTIONNELSLa <strong>de</strong>uxième opération <strong>de</strong> base du Lambda calcul est l’abstraction. Si M = M[x] est une expression quicontient x (ou autrement dit dépend <strong>de</strong> x), puis λx.M[x] désigne <strong>la</strong> fonction x ↦→ M[x]. Par exemple,λx.x ∗ x définit <strong>la</strong> puissance <strong>de</strong> 2. Dans Haskell, nous avons également <strong>la</strong> possibilité <strong>de</strong> définir unefonction par le terme λ comme :λx→x ∗xCette expression définit une nouvelle fonction sur p<strong>la</strong>ce. Elle peut être utilisée dans les définitions <strong>de</strong>sfonctions dans Haskell, comme nous <strong>pour</strong>rons le voir par <strong>la</strong> suite, par exemple, dans <strong>la</strong> définition <strong>de</strong> <strong>la</strong>fonction $, page 62.Une <strong>de</strong>s spécialités du Lambda calcul est <strong>la</strong> façon d’exprimer les fonctions <strong>de</strong> plusieurs argumentspar itération <strong>de</strong> l’application 1 et nous parlons ainsi d’une succession <strong>de</strong>s applications partielles Wik06c .Ainsi, si f(x, y) dépend <strong>de</strong> <strong>de</strong>ux arguments x et y, nous pouvons définir dans le Lambda calcul F x =λy.f(x, y) qui ne dépend que <strong>de</strong> y et F = λx.F x qui ne dépend que <strong>de</strong> x et nous obtenons par conséquent(F x)y = F x y = f(x, y). Haskell suit cette logique et les fonctions <strong>de</strong> plusieurs arguments sont définiesexactement <strong>de</strong> cette manière même si <strong>la</strong> syntaxe du Haskell le cache quelquefois. Par exemple HPF99 , <strong>la</strong>fonction add d’addition <strong>de</strong> <strong>de</strong>ux arguments est définie dans Haskell comme :add (x ,y) = x+yce qui est un exemple d’une définition uncurried. Cette définition est équivalente à une définition curried :add x y = x+yqui correspond àadd = λ x y → x+yce qui est une notation propre à Haskell mais qui n’exprime rien d’autre queadd = λ x → λy → x+yLa <strong>de</strong>rnière définition correspond dans <strong>la</strong> notation du Lambda calcul à l’expression λx.λy.x + y qui peutêtre récrite comme λx.(λy.x + y) = λx.F x en utilisant les fonctions partielles comme décrit auparavant.Les fonctions standards curry et uncurry du Haskell sont dédiées à ce travail.Avant <strong>de</strong> passer à nos propres définitions et expressions dans Haskell, nous voudrions introduirecertaines notions <strong>de</strong> base <strong>pour</strong> que le lecteur non familier avec Haskell ou avec d’autres <strong>la</strong>ngages fonctionnelspuisse <strong>pour</strong>suivre notre raisonnement et comprendre <strong>la</strong> syntaxe et <strong>la</strong> façon <strong>de</strong> construire lesalgorithmes décrits par <strong>la</strong> suite. Pour plus d’informations, nous orientons le lecteur vers une brèveintroduction du Haskell98 HPF99 .La fonction <strong>de</strong> l’i<strong>de</strong>ntité polymorphe id est un exemple trivial d’une fonction définie par Haskell.Elle va nous servir <strong>pour</strong> expliquer <strong>la</strong> syntaxe <strong>de</strong> ce <strong>la</strong>ngage :id :: α → αid x = xLa première ligne définit, par le symbole ::, <strong>la</strong> signature du type <strong>de</strong> <strong>la</strong> fonction id <strong>pour</strong> ses paramètres et<strong>la</strong> valeur <strong>de</strong> retour. Nous lisons <strong>la</strong> définition <strong>de</strong> gauche à droite, dans le sens <strong>de</strong>s flèches. Dans ce cas,il s’agit d’une fonction qui prend un paramètre d’un type polymorphe α, et transforme sa valeur en uneautre valeur du même type α.La <strong>de</strong>uxième ligne définit, en utilisant le symbole =, le corps <strong>de</strong> <strong>la</strong> fonction. Notons que les <strong>la</strong>ngagesbasés sur le Lambda calcul définissent les fonctions comme les règles <strong>de</strong> réécriture. En définissant unefonction dans Haskell, nous prescrivons, en effet, cette règle <strong>de</strong> réécriture. L’expression à gauche <strong>de</strong> =qui correspond à <strong>la</strong> signature <strong>de</strong> <strong>la</strong> fonction sera récrite par l’expression à droite <strong>de</strong> =.Dans ce cas précis <strong>de</strong> <strong>la</strong> fonction id, nous avons à gauche = <strong>la</strong> signature <strong>de</strong> <strong>la</strong> fonction avec unparamètre x qui sera récrite par l’expression à droite <strong>de</strong> =, c’est-à-dire en x sans le changer. C’est <strong>la</strong>définition d’i<strong>de</strong>ntité va<strong>la</strong>ble <strong>pour</strong> les valeurs <strong>de</strong> n’importe quel type.1Il s’agit d’une idée due à M. Schönfinkel, appelée également curryfication Wik06c (du terme ang<strong>la</strong>is currying), selon le nom<strong>de</strong> Haskell Brooks Curry qui a également et indépendamment introduit cette idée BB9461

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!