Детали ошибки ограничения значения
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