2010-09-29 19 views
5

creo que esto es algo relacionado con this question, pero no siendo seguro y puesto que no hay una respuesta real hay, aquí voy:
en Scala no se puede escribir código, tales como:F # abreviada para llamar al método de objeto en lambda

aStringArray.map(_.toUpperCase())

cual es la abreviatura de:

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

¿hay algo como esto en C# o una manera de ponerlo en práctica (sin que el operador o el uso intensivo de reflexión?)? Si eso no es posible, ¿esto se considera como una función de idioma para una versión futura? (¡Realmente la verbosidad de las funciones solo para llamar a un método en un objeto en un cierre!).

Respuesta

6

Como Darío señala, una característica como la sintaxis _.Foo() en Scala no está actualmente disponible en F #, por lo que tendrá que escribir una función lambda explícitamente usando fun a -> a.Foo().

Por lo que sé, una pregunta como esta aparece de vez en cuando en las discusiones de F #, por lo que seguramente fue considerada por el equipo de F #. Es un poco complicado (por ejemplo, ¿desea permitir solo el uso de miembros u otros usos, por ejemplo, _ + 10, y cuál sería el alcance de la expresión lambda?) Además, el valor de la función es relativamente bajo en comparación con otras cosas que podrían ser hecho ... De todos modos, sería bueno tenerlo!

Esta también puede ser una razón por la cual muchos tipos de F # exponen las operaciones como miembros (utilizables en el estilo OO) y funciones en un módulo (para el estilo funcional). Creo que podrías considerarlo como una buena práctica F # (pero depende de tus preferencias de diseño). Ej .:

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) 

continuación, puede utilizar tanto fun v -> v.Add(10) y Foo.add 10 para crear un valor de función. Desafortunadamente, el tipo String no tiene el módulo correspondiente con todas las funciones en las bibliotecas centrales F #, por lo que tendría que escribirlo usted mismo.

-1

Esta no es realmente la respuesta que deseaba, pero actualmente trabajo alrededor de esto creando funciones estáticas ficticias (si voy a necesitar lo mismo varias veces), ya que es más bonita que la sintaxis lambda:

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

'(fun s -> s.toupper())' – Brian

+0

... o 'let toUpper (s: string) = s.ToUpper()' si desea definir una función nombrada. –

+0

@Tomas, sí, eso es lo que estaba buscando, olvidé la definición de tipo. – Benjol

5

Simplemente use fun s -> s.ToUpper() como el parámetro, que crea el mismo tipo de función anónima que Scala.

Tenga en cuenta que este truco ingenioso _ de Scala no (en la actualidad) existe en F #, pero si no estuviera llamando a un método de objeto, es posible que utilices evaluación parcial como en

filter ((=) 42) list 
1

ver este hilo del foro:

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

El equipo de F # ha sido sobre este territorio un número de veces, pero nada viable siempre ha venido de la misma. En este punto, creo que es dudoso que introduzcamos una nueva forma sintáctica que ahorre menos de 10 caracteres.

+1

Es una pequeña cantidad de caracteres, pero la hace conceptualmente mucho más fácil, al menos para mí. Por supuesto, sería más simple si se considera que 'a.b' aplica un operador de punto. Entonces '.b' sería una sintaxis natural. –

+0

Además del guardado en términos de caracteres, que dada la frecuencia con la que aparece este código cuando el uso de bibliotecas clásicas de Oo sería masivo de todos modos, también hay otra gran ventaja: se lee mucho mejor. – em70

Cuestiones relacionadas