Mutate F # [<Struct>] Запись - PullRequest
       23

Mutate F # [<Struct>] Запись

0 голосов
/ 10 ноября 2018

В этом коде показано, как заставить функцию видоизменять свой вход - одна из вещей, которую мы избегаем в F #.

type Age = { mutable n : int }
let printInside a = printfn "Inside = %d" a.n
let inside a =
    a.n <- a.n + 1
    a.n

let a = {n = 1}

printInside a //a = 1
inside a
printInside a //a = 2

Как говорится, как я могу сделать то же самое с [<Struct>] Record с? Я подозреваю, что ref или byref могут быть вовлечены, но я просто не могу заставить его работать.

type [<Struct>] Age = { mutable n : int }
let printInside a = printfn "Inside = %d" a.n
let inside a =
    a.n <- a.n + 1
    a.n

let a = {n = 1}

printInside a //a = 1
inside a
printInside a //a = 2

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Теперь, когда я получил шаблон, вот простой пример (просто int вместо struct record) того, как изменить значения, переданные в функцию:

let mutable a = 1
let mutate (a : byref<_>) = a <- a + 1
mutate &a
a //a = 2
0 голосов
/ 10 ноября 2018

Основная проблема заключается в том, что изменяемое поле может быть изменено, только если сама структура является изменяемой. Как вы заметили, нам нужно использовать byref в объявлении возраста. Нам также нужно убедиться, что a является изменяемым, и, наконец, нам нужно использовать оператор & при вызове функции inside. & - это способ вызова функции с параметром byref.

type [<Struct>] Age = { mutable n : int }
let printInside a = printfn "Inside = %d" a.n
let inside (a : Age byref) =
    a.n <- a.n + 1
    a.n

let mutable a = {n = 1}

printInside a //a = 1
inside &a
printInside a //a = 2
...