2013-02-04 12 views

risposta

16

Come già detto, sì, SML ha solo funzioni a singolo argomento. Voglio elaborare un po ', però.

La seguente funzione:

fun foo (x,y) = x + y 

ha il tipo:

fn : int * int -> int 

Il che significa che il primo argomento è una tupla di due interi. Così si potrebbe fare qualcosa di simile:

(sign o foo) (4,~5) 

che darebbe lo stesso sign (foo (4,~5)).

Ok, ma che dire di qualcosa del genere?

fun bar x y = x + y 

Essa ha il tipo:

fn : int -> int -> int 

che significa che barra ha effettivamente solo ad un numero intero, e restituisce una funzione. Quindi non puoi fare ciò:

(sign o bar) 4 ~5 

Perché la barra restituisce una funzione e il segno prende un numero intero. È possibile fare questo, però:

(sign o bar 4) ~5 

Perché bar 4 è una funzione che aggiunge 4 ad un numero.

+0

Molto utile. Molte grazie! – GregT

+2

Se hai definito una funzione 'uncurry' per facilitare il tuo ultimo" problema "con' sign o bar', ed eventualmente anche una funzione 'flip' che può capovolgere l'ordine degli argomenti capovolgendo la coppia' (x, y) ' a '(y, x)', ecc. –

+0

Jesper: In questo caso, probabilmente definirei un operatore $ e fare 'firmare $ bar xy'. – Tayacan

6

SML ha solo funzioni a singolo argomento; foo(x,y) è una funzione foo che prende un singolo argomento, la tupla (x, y). Pertanto, non è necessaria alcuna gestione speciale e bar(x) dovrà restituire una tupla del tipo appropriato per comporla con foo.

3

Ho visto alcuni codici ML standard (in particolare il codice Poly/ML Isabelle/Pure) che mette operatori di composizione aggiuntivi nell'ambiente di livello superiore che gestiscono questo tipo di situazione. Es .:

fun (f oo g) x y = f (g x y) 
fun (f ooo g) x y z = f (g x y z) 
fun (f oooo g) x y z w = f (g x y z w) 

In generale, queste cose dovrebbero essere usati con parsimonia (quattro o più o di sta ottenendo un po 'stupido), ma è molto utile avere almeno oo intorno.