L'operatore di composizione o
(ad esempio val x = foo o bar
, dove foo
e bar
sono entrambe funzioni), utilizzabili solo su funzioni a argomento singolo e/o funzioni con un numero uguale di argomenti? In caso contrario, qual è la sintassi per, per esempio, componendo foo(x,y)
con bar(x)
.L'operatore SML `o` è utile solo per le funzioni a argomento singolo?
risposta
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.
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
.
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.
Molto utile. Molte grazie! – GregT
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. –
Jesper: In questo caso, probabilmente definirei un operatore $ e fare 'firmare $ bar xy'. – Tayacan