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.
- 1. Wie nützlich ist C#? Operator?
- 2. SML-Option Monad (Bind-Operator funktioniert nicht)
- 3. Was ist Control.Applicative.Lift nützlich für?
- 4. Warum ist std :: equal_to nützlich?
- 5. Wofür ist Clojure nützlich?
- 6. Nur Druckausgabe mit SML/NJ drucken
- 7. Was ist die BlockingCollection.TakeFromAny Methode nützlich für
- 8. Wie nützlich ist Response.IsClientConnected?
- 9. Ist Vagrant nützlich für Java/Javaee Entwickler?
- 10. Für was ist nützlich scikit-lernen FunctionTransformer?
- 11. SML [Zirkularität] Fehler
- 12. Ist der Rails for Zombies Kurs nützlich?
- 13. Der abgerundete Ecken Ajax-Effekt ist nützlich für?
- 14. SML: Fehler: Operator und Operand stimmen nicht überein [Tycon Mismatch]
- 15. Wann ist File.join nützlich?
- 16. Warum ist match.call nützlich?
- 17. Wofür ist ein Tupel nützlich?
- 18. Warum ist package-info.java nützlich?
- 19. Was ist die Verwendung von Mcrt1.o und Scrt1.o?
- 20. Wann ist der gemeinsame Codebesitz nützlich?
- 21. Ist der Primärschlüssel nützlich, wenn nie
- 22. Wie nützlich ist Groovy ++?
- 23. Was ist der Zweck von "::" und warum ist es nützlich?
- 24. crt0.o und crt1.o - Was ist der Unterschied?
- 25. Ist WPF Decorator-Klasse nützlich?
- 26. Was ist der @ Operator?
- 27. Ruby unary operator `&` nur gültig für Methodenargumente
- 28. ist der Operator "ist" nur syntaktische Zucker für die "IsInstanceOfType" -Methode
- 29. Ist Objekt-Slicing immer nützlich?
- 30. Wann ist ein ConcurrentSkipListSet nützlich?
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