2013-02-04 5 views

Antwort

16

Wie Michael bereits gesagt hat, ja, SML hat nur einzelne Argumentfunktionen. Ich möchte jedoch etwas näher ausführen.

Die folgende Funktion:

fun foo (x,y) = x + y 

Hat der Typ:

fn : int * int -> int 

was bedeutet, dass das erste Argument ein Tupel von zwei ints ist. So könnte man so etwas wie:

(sign o foo) (4,~5) 

Welche Sie das gleiche wie sign (foo (4,~5)) geben würde.

Okay, aber was ist mit so etwas?

fun bar x y = x + y 

Es hat den Typ:

fn : int -> int -> int 

was bedeutet, dass tatsächlich nur eine bar ganze Zahl annimmt, und gibt eine Funktion. So können Sie das nicht tun:

(sign o bar) 4 ~5 

Da bar eine Funktion zurückgibt und Zeichen eine Ganzzahl nimmt. Sie können dies tun, aber:

(sign o bar 4) ~5 

Da bar 4 eine Funktion, die 4 zu einer Reihe ergänzt.

+0

Sehr hilfreich. Danke vielmals! – GregT

+2

Wenn Sie eine 'uncurry'-Funktion definiert haben, um Ihr letztes" Problem "mit' sign o bar 'zu erleichtern, und möglicherweise auch eine' flip'-Funktion, die die "Argument-Reihenfolge" umdrehen kann, indem Sie das Paar '(x, y)' spiegeln zu '(y, x)', etc. –

+0

Jesper: In diesem Fall würde ich wahrscheinlich einen $ Operator definieren und $ bar xy signieren. – Tayacan

6

SML hat nur einzelne Argumentfunktionen; foo(x,y) ist eine Funktion foo mit einem einzigen Argument, das Tupel (x, y). Daher ist keine spezielle Behandlung erforderlich und bar(x) muss ein Tupel des entsprechenden Typs zurückgeben, um es mit foo zu komponieren.

3

Ich habe einige Standard-ML-Codes (insbesondere den Poly/ML-Code Isabelle/Pure) gesehen, die zusätzliche Kompositionsoperatoren in die Top-Level-Umgebung bringen, die diese Art von Situation bewältigen. Z.B .:

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) 

Im Allgemeinen sollten solche Dinge sparsam verwendet werden (vier oder mehr O ist immer ein bisschen albern), aber es ist sehr nützlich, zumindest oo um aufweist.