[cduce-users] Transformation d'une liste

Alain.Frisch at ens.fr Alain.Frisch at ens.fr
Fri Jul 25 11:53:11 CEST 2003


[
  for english readers: the post is about differences between map and
  transform; they are explained here:
  http://www.cduce.org/manual_expressions.html#seq
]

Bonjour Serge,

> let menu : Menu =
>    <menu>[ ligue stage club ]
>    ;;
>
> let transform_menu (Menu_item -> Xdd;
>                      Menu_group -> [ (Xdt | Xdd)+ ];
>                      Menu -> Xdl )
>    | <menu_item title=t>s -> <dd>[ <a title=t>s ]
>    | <menu_group title=t>g -> [ <dt>[ <b>t ] !(map g with i ->
> transform_menu i) ]
>    | <menu>m -> <dl>(map m with g -> transform_menu g)
>    ;;
>
> transform_menu menu ;;

> Je ne parviens pas à trouver une solution. Pouvez-vous m'aider ?

Il suffit de remplacer map par transform.

La différence entre les deux, c'est que map transforme chaque élément de
la liste argument par un nouvel élément. La liste obtenue a donc la même
longueure. Au contraire, transform peut remplacer chaque élément par zero,
un, ou plusieurs éléments. Chaque branche de transform doit donc renvoyer
une séquence, et les séquences obtenues pour chaque élément de la liste
argument sont concaténées.

Concrètement, transform, c'est la composition de map et de l'opérateur
flatten. On peut aussi voir map comme un cas particulier de transform:

map e1 with p -> e2  === transform e1 with p -> [ e2 ]


Petite différence: map impose que chaque élément de la liste est accepté
par une des branches, alors que transform supprime les éléments non
acceptés (comme s'il y avait une branche implicite _ -> []).


-- Alain




More information about the Cduce-users mailing list