2012-07-09 13 views
6

Ich dachte immer, dass F # zwei verschiedene Möglichkeiten hat, Argumente, Curry-Stil und Tupel-Stil zu übergeben. Ist das wirklich richtig?F # parameter passing

Ist es nicht einfach ein Stil, Curry-Stil und Argumente können entweder einfache Werte oder Tupel sein.

z.B.

someFunc (a,b) = 

ist nicht eine Funktion mit ein Curry Stil Argument, das ein Tupel sein geschieht? So kann ich Tupel zu dieser Funktion mit dem Pipeline-Operator übergeben? (wo die Elemente des Tupel genannt)

(1,2) |> someFunc 

Ist das richtig?

Antwort

6

Das wird gut funktionieren - der Unterschied ist, wenn Sie

let f (a,b) = ... 
let f2 a b = ... 

dann haben Sie leicht eine teilweise angewendet f2 schaffen kann, aber für f es nicht ganz so gut funktioniert - Sie haben

zu tun
let partial = fun t -> f (1,t) 
let partial2 = f2 1 
+0

Ja, und ist das nicht einfach, weil "f" _one_ Argument hat, das ein Tupel mit benannten Elementen ist? Ich meine, man kann funky Sachen wie "somefunc abc (d, e, f) g" machen und das ist offensichtlich weder purer Curry- noch Typle-Stil, was mich überzeugt hat, dass F # nur Curry-Stil hat, wo Argumente einfach Werte oder Tupel sind. Ist das der richtige Weg, darüber nachzudenken? –

+0

Das ist richtig. –

4

Ja, alle F # Funktionen sind "Curry-Stil". Wenn Sie eine Definition wie haben:

let someFunc (a,b) = a + b 

Sie haben eine Funktion, die ein Argument, ein Tupel nimmt, die durch Muster zerlegt wird passend (ja, Pattern-Matching in überraschend süß Orte wie diese verfügbar ist). Es entspricht die folgende Definition, die das Muster auf den Körper der Funktion bewegt passende:

let someFunc t = 
    match t with 
    | a, b -> a + b 

die auch

entsprechen
let someFunc = function 
    | a, b -> a + b 

Die erste Version, mit dem Muster in dem Argumente passenden selbst , ist in diesem Fall von einfach benannten Bindungen offensichtlich vorzuziehen.

Beachten Sie, dass F# methods jedoch "Tupel-Stil" sind (dies ist einer jener Orte, an denen F # in standardmäßige objektorientierte .NET-Funktionen integriert wird).