2009-05-02 6 views
14

¿Cómo voy a hacer esto (C#) en Fa #¿Cómo hacer expresiones lambda multilínea en f #?

public class MyClass 
{ 
    void Render(TextWriter textWriter) 
    { 
     Tag(() => 
       { 
        textWriter.WriteLine("line 1"); 
        textWriter.WriteLine("line 2"); 
       }); 
     Tag(value => 
       { 
        textWriter.WriteLine("line 1"); 
        textWriter.WriteLine(value); 
       }, "a"); 
    } 

    public void Tag(Action action) 
    { 
     action(); 
    } 
    public void Tag<T>(Action<T> action, T t) 
    { 
    action(t); 
    } 
} 

Respuesta

23

Un lambda de varias líneas en Fa # es sólo

(fun args -> 
    lots 
    of 
    code 
    here 
) 

Todo el código sería algo así como

open System.IO 

type MyClass() as this = 
    let Render(tw : TextWriter) = 
     this.Tag(fun() -> 
      tw.WriteLine("line1") 
      tw.WriteLine("line2") 
     ) 
     this.Tag(fun(value : string) -> 
      tw.WriteLine("line1") 
      tw.WriteLine(value) 
     , "a" 
     ) 
    member this.Tag(action) = 
     action() 
    member this.Tag(action, x) = 
     action(x) 

asumiendo No cometí errores de transcripción (Utilicé los tipos de función F # en lugar de los delegados de Acción en la interfaz pública.)

+2

Genial, pero ¿cómo se ve el código C# en su ejemplo en F #? – ichiban

+0

respuesta perfecta. – Simon

5

Si todo lo que quiere hacer es escribir varias líneas lambdas, puede encadenar varias instrucciones utilizando el operador de punto y coma entre paréntesis. Ejemplo:

(fun() -> (write_line "line 1" ; write_line "line 2")) 

y

(fun val -> (write_line "line 1" ; write_line val)) 

Aunque el segundo ejemplo que he dado sólo funciona si el tipo de val es cadena.

Advertencia: No conozco los detalles de F #. Estoy escribiendo esto desde un fondo de Objective Caml. Los idiomas son muy similares, pero puede haber algunas diferencias que hacen que mi sugerencia sea ligeramente incorrecta. Además, no estoy en una máquina con un intérprete ocaml o F # ahora, así que no puedo verificar estos fragmentos para asegurarme de que funcionen.