Bonsoir ou bonjour,
Cette petite fonction (S)ML ajoute un élément à une liste, mais ne l’ajoute que s’il n’y existe pas déjà.
Ça marche, mais je l’écrirais intuitivement encore plutôt de cette manière :Code:fun add (nil, e) = e :: nil | add (l as head :: tail, e) = if head = e then l else head :: add (tail, e);
Malheureusement, ça ne marche pas, parce que dansCode:fun add (nil, e) = e :: nil | add (l as e :: tail, e) = l | add (l as head :: tail, e) = head :: add (tail, e);
“e” apparait deux fois, ce qui n’est pas permis, comme le rappel l’interpréteur.Code:| add (l as e :: tail, e) = l
Ceci montre une limite du pattern matching de ML comparé à celui de Prolog.
Je me demandais pourquoi il n’est pas permis d’avoir
Est-ce que ce sont des raisons logiques ou seulement des raisons techniques qui ont motivés ce choix pour la spécification de ML ?Code:| add (l as e :: tail, e) = l
Existe-t-il un langage similaire à ML qui permet cela ?
Existe t-il des documents faisant une comparaison de Prolog (ou du pattern matching à proprement parler) et de ML ? J’ai cherché, mais sans succès : pas de document à ce sujet sur le net.
-----