Детали ошибки ограничения значения

let empties = Array.create 100 []

Дает ошибку ограничения значения:error FS0030: Value restriction. The value 'empties' has been inferred to have generic type val empties : '_a list []. Either define 'empties' as a simple data term, make it a function with explicit arguments or, if you do not intend for it to be generic, add a type annotation.

Пока это не так:

let makeArray () = Array.create 100 []

Так в чем же разница? Я знаю, что в SO вопросы включаются слова "что вы пробовали", но я даже не знаю, что попробовать, это концептуальный вопрос...

1 ответ

Ссылки в комментариях должны прояснить большинство ваших вопросов. Но что вы хотите достичь с помощью этого кода? Вы хотите массив из 100 пустых списков?

по факту makeArray () не отличается от empties, Если вы выполните его, вы получите то же сообщение об ошибке:

Ошибка FS0030: ограничение значения. Значение 'it' было выведено, чтобы иметь универсальный тип val it: '_a list [] Либо определите' it 'как простой термин данных, сделайте его функцией с явными аргументами или, если вы не планируете, чтобы он был универсальным, добавьте аннотацию типа.

Это создаст массив из 100 списков:
let mkArr2<'a> = Array.create<'a list> 100

Аналогично, но со значением по умолчанию 0 (но я избавился от параметра списка []):
let mkArr3<'a> = Array.zeroCreate<'a> 100

И, наконец, пустой массив:
let mkArr4<'a> = Array.empty<'a>

Или, может быть, что-то вроде этого с традиционным синтаксисом инициализации массива:
let mkArr5<'a> = Array.init 100 (fun _ -> []:'a list)

Для вашего конкретного примера вы можете просто добавить аннотацию общего типа. использование 'a list или же 'a array если вы хотите массив списков / массивов.
let empties<'a> = Array.create<'a> 100

Другие вопросы по тегам