2010-09-29 4 views
5

Ich denke, dies zu this question etwas verwandt ist, aber ist nicht sicher, und da gibt es keine wirkliche Antwort gibt, hier gehe ich:
in Scala gibt es Sie Code schreiben können, wie:F # verkürztes Verfahren auf Objekt in Lambda zu nennen

aStringArray.map(_.toUpperCase())

, die ist eine Abkürzung für:

aStringArray.map(s => s.toUpperCase())

gibt es etwas wie dies in F # oder einen Weg, es zu implementieren (ohne dass der Bediener oder die starke Nutzung von Reflektion?)? Wenn das nicht möglich ist, wird dies als Sprachfunktion für eine zukünftige Version angesehen? (Ich habe wirklich die Ausführlichkeit von Funktionen, nur um eine Methode auf ein Objekt in einer Schließung aufzurufen!).

Antwort

6

Als Dario weist darauf hin, dass eine Funktion wie _.Foo() Syntax in Scala derzeit nicht in F # verfügbar ist, so müssen Sie eine Lambda-Funktion explizit mit fun a -> a.Foo() schreiben.

Soweit ich weiß, taucht bei F # Diskussionen hin und wieder eine Frage auf, die vom F # Team mit Sicherheit in Betracht gezogen wurde. Es ist ein bisschen schwierig (zB wollen Sie nur Mitgliedsverwendungen oder andere Verwendungen zulassen, zB _ + 10, und was wäre der Umfang des Lambda-Ausdrucks?) Außerdem ist der Wert des Features im Vergleich zu anderen Dingen relativ gering fertig ... Wie auch immer, es wäre schön, es zu haben!

Dies kann auch ein Grund sein, warum viele F # -Typen Operationen sowohl als Member (im OO-Stil verwendbar) als auch als Funktionen in einem Modul (für den funktionalen Stil) verfügbar machen. Ich denke, du könntest es als eine gute F # -Praxis betrachten (aber es hängt von deinen Designvorlieben ab). Z.B .:

type Foo(a:int) = 
    member x.Add(b:int) = a + b 

// Attribute allows you to define module with the same name 
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>] 
module Foo = 
    let add b (v:Foo) = v.Add(b) 

Dann können Sie sowohl fun v -> v.Add(10) und Foo.add 10 verwenden, um einen Funktionswert zu schaffen. Leider hat der Typ String kein entsprechendes Modul mit allen Funktionen in den F # -Bibliotheken, so dass Sie es selbst schreiben müssen.

-1

Dies ist nicht wirklich die Antwort, die Sie wollten, aber zur Zeit arbeite ich um statische Dummy-Funktionen zu erstellen (wenn ich die gleiche Sache mehrmals benötigen), wie es schöner als die Lambda-Syntax ist:

let toupper (s:string) = s.ToUpper() 
aStringArray.map toupper 
+0

'(Spaß s -> s.toupper())' – Brian

+0

... oder 'let toUpper (s: string) = s.ToUpper()', wenn Sie eine benannte Funktion definieren möchten. –

+0

@Tomas, ja, genau das habe ich angestrebt, habe die Typdefinition vergessen. – Benjol

5

Verwenden Sie einfach fun s -> s.ToUpper() als Parameter, die die gleiche Art von anonymer Funktion Scala erstellt.

Beachten Sie, dass dieser raffinierte _ Trick von Scala ist (derzeit) nicht existiert in F #, aber wenn man nicht eine Objektmethode fordert, könnten Sie nur Teilauswertung verwenden wie in

filter ((=) 42) list 
1

Siehe in diesem Forum-Thread:

http://cs.hubfs.net/forums/permalink/13313/13319/ShowThread.aspx#13319

Das Fis-Team über dieses Gebiet eine Reihe von Zeiten gewesen ist, aber nichts praktikabel hat es jemals kommen. An dieser Stelle denke ich, es ist zweifelhaft, dass wir eine neue syntaktische Form einführen werden, die weniger als 10 Zeichen speichert.

+1

Es ist eine kleine Anzahl von Zeichen, aber es macht es konzeptionell viel einfacher, zumindest für mich. Natürlich wäre es einfacher, wenn "a.b" als Anwendung eines Punktoperators betrachtet wird. Dann wäre '.b' eine natürliche Syntax. –

+0

Neben der Sicherung in Zeichen, die angesichts der Häufigkeit, mit der dieser Code erscheint, wenn man klassische Oo-Bibliotheken benutzt, wäre sowieso riesig, es gibt noch einen weiteren großen Vorteil: Es liest viel besser. – em70