2009-06-03 8 views
3

Ich bin durch die Art und Weise wie "Punktnotation" funktioniert mit Objekten und Datensätzen beim Versuch, in einem Punkt-freien funktionalen Stil zu programmieren (was ich denke, ist eine große, prägnante) Möglichkeit, eine funktionale Sprache zu verwenden, die standardmäßig verwendet wird).Point-free-Stil mit Objekten/Aufzeichnungen in F #

Gibt es einen Operator oder eine Funktion, die ich vermisse, die mich etwas wie tun lassen kann: (.) object method anstelle von object.method?

(Von dem, was ich über den neuen ? Operator las, ich denke, es ist wie das funktioniert. Außer es Definition erfordert und wird in die ganze dynamische Bindung Sache, die ich nicht glaube, ich brauche.)

Mit anderen Worten, kann ich eine Methode auf sein Objekt als ein Argument anwenden, wie ich eine normale Funktion auf sein Argument anwenden würde?

+1

So beunruhigend es klingt und aussieht (aufgrund der Notwendigkeit, mehr Klammern zu machen) Ich fürchte, es gibt keinen Weg. – em70

Antwort

5

Kurze Antwort: Nein.

Lange Antwort: Sie in einem Modul natürlich erstellen lassen gebundene Funktionen, die eine Methode auf einem bestimmten Typ Zum Beispiel im Code ... nennen

let l = [1;2;3] 
let h1 = l.Head 
let h2 = List.hd l 

gibt es ein Gefühl, in der „Liste .hd "ist die Version dessen, was Sie für" .Head auf einer Liste "möchten. Oder lokal können Sie immer z.

Aber es gibt nichts allgemeines, da es keinen guten Weg gibt, eine beliebige Instanzmethode für einen gegebenen Typ zu "benennen"; "AnotherWay" zeigt eine Möglichkeit, "eine Funktion aus der Eigenschaft 'Head' auf einer 'Liste < _>' Objekt" zu machen, aber Sie benötigen ein solches Muster für jede Instanzmethode, die Sie als einen erstklassigen Funktionswert behandeln wollen.

Ich habe vorgeschlagen, ein Sprachkonstrukt zu schaffen, dies zu verallgemeinern:

In Bezug auf Sprache Design Vorschläge, was passiert, wenn

SomeType..Foo optArgs // note *two* dots 

bedeutete
fun (x : SomeType) -> x.Foo optArgs 

?

In diesem Fall werden Sie

list<_>..Head 

als eine Möglichkeit, zu ‚functionize‘ diese Instanz Eigenschaft schreiben könnte, aber wenn wir jemals in F # in dieser Arena alles tun, wäre es nach VS2010 sein.

+2

Es gab Fälle, in denen ich eine Sequenz von Strings in ihre jeweilige Länge "mappen" musste und ein Lambda erstellen musste, nur um auf seine Instanzeigenschaften zugreifen zu können. Ich würde gerne einen Weg sehen, wie man auf diese Weise auf sie zugreift. Es würde jedoch einige bestehende Funktionen überflüssig machen. (Wie Liste.hd) – YotaXP

2

Wenn ich Ihre Frage richtig verstehe, ist die Antwort: Nein, Sie können nicht. Punkt (.) Ist kein Operator in F #, er ist in die Sprache integriert und kann daher nicht als Funktion verwendet werden.