2009-09-06 4 views
3

Par exemple, au lieu deExiste-t-il un moyen d'obtenir une forme carrée des opérateurs binaires dans SML/NJ?

- op =; 
val it = fn : ''a * ''a -> bool 

Je préférerais avoir

- op =; 
val it = fn : ''a -> ''a -> bool 

pour une utilisation dans

val x = getX() 
val l = getList() 
val l' = if List.exists ((op =) x) l then l else x::l 

Il est évident que je peux le faire moi-même, par exemple,

val l' = if List.exists (fn y => x = y) l then l else x::l 

mais je veux m'assurer que je ne manque pas une manière plus élégante.

Répondre

5

Vous pouvez écrire une fonction d'aide qui currys une fonction:

fun curry f x y = f (x, y) 

Ensuite, vous pouvez faire quelque chose comme

val curried_equals = curry (op =) 
val l' = if List.exists (curried_equals x) l then l else x::l 
+0

+1. Et pour le contraire, vous pouvez écrire 'fun decurry f (x, y) = f x y'. (Ceci est utile pour appeler des fonctions comme 'foldl' qui attendent une fonction binaire.) – ruakh

2

Mes connaissances de SML sont rares, mais j'ai parcouru le livre d'Ullman et je ne pouvais pas trouver un moyen facile de convertir une fonction qui accepte un tuple en une fonction curry. Ils ont deux signatures différentes et ne sont pas directement compatibles entre eux.

Je pense que vous allez devoir rouler les vôtres.

Ou passez à Haskell. Edit: J'ai réfléchi à cela et je sais maintenant pourquoi l'un n'est pas le même que l'autre. En SML, presque toutes les fonctions que vous utilisez n'acceptent qu'un seul paramètre. Il se trouve que la plupart du temps vous passez un tuple avec plus d'un élément. Cependant, un tuple est une valeur unique et est traité comme tel par la fonction. Vous ne pouvez pas passer une telle fonction un tuple partiel. C'est soit le tuple entier ou rien.

Toute fonction qui accepte plus d'un paramètre est, par définition, carnée. Lorsque vous définissez une fonction qui accepte plusieurs paramètres (par opposition à un seul tuple avec plusieurs éléments), vous pouvez l'appliquer partiellement et utiliser sa valeur de retour comme argument d'une autre fonction.

+1

état Vous « une fonction qui accepte plus d'un paramètre est, par définition, au curry ". Eh bien, je pense qu'une fonction de type ('a ->' b -> 'c) accepte aussi juste un seul paramètre (le' a), il arrive juste de retourner une autre fonction qui est de type ('b ->' c). Ceci est dû au fait que l'opérateur "->" est associatif à droite: ('a ->' b -> 'c) = (' a -> ('b ->' c)). L'application partielle n'est alors qu'une conséquence de cela. L'application de fonction est à gauche associative, de sorte que (myFun arg1 arg2 arg3) = (((myFun arg1) arg2) arg3). – harms

Questions connexes