Come Dario sottolinea che una funzione come la sintassi _.Foo()
in Scala non è attualmente disponibile in F #, quindi dovrai scrivere esplicitamente una funzione lambda usando fun a -> a.Foo()
.
Per quanto ne so, una domanda come questa appare di tanto in tanto nelle discussioni di F #, quindi è stata sicuramente considerata dal team di F #. È un po 'complicato (es. Vuoi consentire solo usi membri o altri usi, ad esempio _ + 10
, e quale sarebbe lo scopo dell'espressione lambda?) Inoltre, il valore della funzione è relativamente basso rispetto ad altre cose che potrebbero essere fatto ... Comunque, sarebbe bello averlo!
Questo potrebbe essere anche un motivo per cui molti tipi di F # espongono le operazioni come entrambi i membri (utilizzabili nello stile OO) e funzionano in un modulo (per lo stile funzionale). Penso che potresti considerarlo una buona pratica di F # (ma dipende dalle tue preferenze di progettazione). Es .:
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)
quindi è possibile utilizzare sia fun v -> v.Add(10)
e Foo.add 10
per creare un valore della funzione. Sfortunatamente, il tipo String
non ha il modulo corrispondente con tutte le funzioni nelle librerie principali F #, quindi dovresti scriverlo da solo.
fonte
2010-09-29 16:27:42
'(fun s -> s.toupper())' – Brian
... o 'let toUpper (s: string) = s.ToUpper()' se si desidera definire una funzione con nome. –
@Tomas, sì, questo è quello che stavo puntando, ho dimenticato la definizione del tipo. – Benjol