Аргументы изменяемой функции F # - PullRequest
10 голосов
/ 23 сентября 2010

Есть ли способ иметь изменяемые аргументы функции в F #, который позволял бы что-то вроде

let mutable i = 9

let somefun n = n <- 12; ()

somefun i

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

Я понимаю, что это можно сделать, обернув его в тип записи

type SomeRec = { mutable i: int }

let ri = { i = 9 }

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

и что это можно сделать аналогичным образом для учеников.Тем не менее, даже после просмотра всей спецификации языка F # (да, я сделал!), Кажется, нет никакого синтаксиса, чтобы разрешить первый случай, и компилятор, похоже, очень недоволен моей попыткой сделать это.Я надеялся, что будут какие-то аннотации типов, но в таких случаях нельзя использовать mutable.

Я также знаю, что я не должен делать такие вещи в первую очередь, но в первом случае (int обязательный) и второй (record тип) семантически идентичны, и любое такое возражение будет одинаково справедливо для обоих случаев.

Так что я думаю, что здесь что-то не хватает.

Ответы [ 2 ]

16 голосов
/ 23 сентября 2010

Вы можете использовать ref в качестве аргументов

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

Или ключевое слово byref

let mutable v = 0
let mutate (r : byref<_>) = 
    r <- 100
mutate &v
printfn "%d" v
9 голосов
/ 23 сентября 2010

Используйте ключевое слово byref, которое равно C # ref.См. Раздел «Передача по ссылке» в http://msdn.microsoft.com/en-us/library/dd233213.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...