Как мне создать изменяемый тип опции F #? - PullRequest
4 голосов
/ 05 марта 2010

Мне нужно создать изменяемый тип option<T> в F #. Я пытался написать

let x = ref None

и впоследствии писать

x := Some(z)

но это не работает. Помогите!

Ответы [ 2 ]

7 голосов
/ 05 марта 2010

Вам необходимо явно указать тип, чтобы избежать «Ограничение значения» (или см. «Автоматическое обобщение» в msdn ):

let x : Ref<int option> = ref None

x := Some 4
4 голосов
/ 05 марта 2010

Также обратите внимание, что вы сталкиваетесь с этой проблемой только при вводе кода в интерактивном режиме F # построчно. Если вы введете первую строку без указания аннотации типов, вы получите сообщение об ошибке:

> let x = ref None;;
// Tests.fsx(1,7): error FS0030: Value restriction.

Однако, если вы введете большую часть кода, которая использует ячейку x ref (например, присваивает ей значение), тогда F # сможет вывести тип из более поздней части кода, поэтому вы выиграли не нужно никаких аннотаций типа. Например:

> let x = ref None
  x := Some(10);;

Это будет работать нормально, потому что F # выведет тип x из второй строки. Это означает, что вам, вероятно, не понадобятся какие-либо аннотации типов, если вы отправите код в F # в интерактивном режиме для тестирования большими порциями (а в скомпилированном коде F # вы почти никогда не столкнетесь с этой проблемой).

...