`ref` или` mutable` оператор присваивания, использующий F # - PullRequest
3 голосов
/ 18 октября 2011

Рассмотрим следующий код:

let mutable a = 0.
let b = ref 0.

a <- // works
  printfn "%A" a
  4. + 8.

b := // does not work
  printfn "%A" a
  4. + 8.

b := ( // works
  printfn "%A" a
  4. + 8. )

Почему оператор присваивания ref (: =) имеет поведение, отличное от изменяемого оператора присваивания (<-)? </p>

Ответы [ 4 ]

2 голосов
/ 18 октября 2011

Я могу дать только частичный ответ.

:= определяется в терминах <- в FSharp.Core \ prim-types.fs:

let (:=) x y = x.contents <- y

В вашемпример

b := // does not work
  printfn "%A" a
  4. + 8.

printfn "%A" a, по-видимому, интерпретируется как y, который нельзя присвоить ячейке int ref (неправильный тип).Группируя все выражение с ( ... ), y теперь также содержит 4. + 8..Возможно, эти два оператора ведут себя по-разному, потому что <- кажется внутренним оператором (т. Е. Частью языка, а не библиотеки).

1 голос
/ 18 октября 2011

Опираясь на другие ответы ...

В присваиваниях допускаются более сложные выражения, если последнее выражение является одной из нескольких допустимых форм.См. раздел 6.4.9 спецификации.Это позволяет выполнять сложные назначения, такие как:

let x =
  let rec gcd a = function
    | 0 -> a
    | b -> gcd b (a % b)
  gcd 10 25

Компилятор перемещает gcd в приватный член, но его размещение в назначении позволяет более ограниченную область видимости.Аргументы функции, с другой стороны, более ограничены.Они не создают новую область видимости (о которой я знаю), и вы не можете определять функции, например, как часть выражения.

1 голос
/ 18 октября 2011

:= - это функция (try (: =) ;; в FSI), которая имеет тип: 'a ref -> 'a -> unit

Итак

b := // does not work
  printfn "%A" a
  4. + 8.

анализируется как из-за правила разбора вызова инфикса:

(:=) b (printfn "%A" a)
4. + 8.

Недопустимый тип функции (: =). Другой пример:

let c = 10 + 
            11 
            12

c будет 12 здесь

0 голосов
/ 21 сентября 2013

Похоже на расхождение в чувствительном к отступам синтаксическом анализаторе, а не на то, что конкретно связано с этими операторами.

...