Ist der o
Zusammensetzungsoperator (z. B. val x = foo o bar
, wobei foo
und bar
beide Funktionen sind), nur für Einzelargumentfunktionen und/oder Funktionen mit gleicher Anzahl von Argumenten verwendbar? Wenn nicht, wie lautet die Syntax für beispielsweise foo(x,y)
mit bar(x)
.Ist der SML `o`-Operator nur für Einzelargumentfunktionen nützlich?
Antwort
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.
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.
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.
Sehr hilfreich. Danke vielmals! – GregT
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. –
Jesper: In diesem Fall würde ich wahrscheinlich einen $ Operator definieren und $ bar xy signieren. – Tayacan