2010-09-23 13 views
8

¿Hay una manera de tener argumentos de la función mutables en F #, que permitiría algo así comoF # argumentos de la función mutable

let mutable i = 9 

let somefun n = n <- 12;() 

somefun i 

(* *not* a real-world example *) 

entiendo que esto puede ser hecho para trabajar envolviéndolo en un tipo de registro

type SomeRec = { mutable i: int } 

let ri = { i = 9 } 

let someotherfun r = r.i <- 12;() 

y que esto se puede hacer de manera similar para los miembros de la clase. Sin embargo, incluso después de navegar a través de toda la especificación de lenguaje F # (sí, lo hice!), Parece que no hay sintaxis para permitir el primer caso, y el compilador parece estar bastante descontento con mi intento de esto. Esperaba que hubiera algún tipo de anotación de tipo, pero mutable no se puede usar en tal.

También sé que no debería estar haciendo este tipo de cosas en primer lugar, pero el primer caso (vinculación int) y el segundo tipo (record) son semánticamente idénticos, y cualquier objeción se aplicaría para ambos casos Igualmente.

Así que creo que me falta algo aquí.

+8

Si necesita mutar sus parámetros, todavía está pensando de forma imperativa. ¿Puede describir exactamente lo que está tratando de hacer, tal vez alguien puede sugerir una solución más idiomática en su lugar? – Juliet

Respuesta

14

Se puede utilizar como argumentos ref

let v = ref 0 
let mutate r = 
    r := 100 
mutate v 
printfn "%d" !v 

O ByRef palabra clave

let mutable v = 0 
let mutate (r : byref<_>) = 
    r <- 100 
mutate &v 
printfn "%d" v 
+3

Tenga en cuenta que 'byref' es como C#' ref'. Si necesita C# 'out', entonces use' byref' pero también agregue el atributo '[]' al parámetro. – Brian

+3

Esta respuesta es técnicamente correcta, pero me avergonzaría de verla usada en la práctica. OP debería ajustarse a las expresiones F # en lugar de intentar escribir C# con una sintaxis un poco diferente. – Juliet

+3

@Juliet Esto puede ser * mucho * más rápido que el equivalente funcional en F #. Lo he usado en el código de producción. –

8

Use byref palabra clave que es igual a C# ref. Vea la sección "Pasando por referencia" al http://msdn.microsoft.com/en-us/library/dd233213.aspx

+0

Cariño, todavía me faltan bits bastante básicos. Supongo que ya volví a leer todo * otra vez *. Lo siento, solo puedo marcar una respuesta 'aceptada', pero votaré esta. –

+0

Acabo de encontrar el artículo de Jon Skeet sobre los parámetros que pasan en otro tema: http://www.yoda.arachsys.com/csharp/parameters.html Está en C#, pero esto es justo lo que necesita ahora. –