Мне нужно создать изменяемый тип option<T>
в F #. Я пробовал писатьКак создать тип опции F # mutable?
let x = ref None
, а затем писать
x := Some(z)
, но он не работает. Помогите!
Мне нужно создать изменяемый тип option<T>
в F #. Я пробовал писатьКак создать тип опции F # mutable?
let x = ref None
, а затем писать
x := Some(z)
, но он не работает. Помогите!
Вы должны указать тип явно, чтобы избежать "the Value Restriction" (или см "Automatic Generalization" on msdn):
let x : Ref<int option> = ref None
x := Some 4
отметить также, что вы столкнулись с этой проблемой только при вводе кода в F # interacative линию за линией. Если ввести первую строку без предоставления аннотацию типа, вы получите ошибку:
> let x = ref None;;
// Tests.fsx(1,7): error FS0030: Value restriction.
Однако, если вы вводите большую porition кода, который использует x
реф ячейку (например, присваивает ему значение) то F # сможет вывести тип из более поздней части кода, поэтому вам не понадобятся аннотации типов. Например:
> let x = ref None
x := Some(10);;
Это будет работать нормально, потому что F # будет определить тип x
от второй линии. Это означает, что вам, вероятно, не нужны аннотации типов, если вы будете отправлять код в F # в интерактивном режиме для тестирования большими порциями (и в скомпилированном коде F # вы почти никогда не столкнетесь с этой проблемой).
Просто интересно, но зачем вам когда-либо понадобился измененный вариант? – Juliet