Ограничение значения F# в пустом списке
У меня есть функция F#:
let removeEven (listToGoUnder : _ list) =
let rec listRec list x =
match list with
| [] -> []
| head::tail when (x%2 = 0) -> head :: listRec (tail) (x+1)
| head::tail -> listRec (tail) (x+1)
listRec listToGoUnder 0
Удаляет все элементы с четным индексом в списке. Это работает, если я даю список некоторый импульс, как removeEven ['1';'2';'3']
я получил ['1';'3']
что я должен. Но когда я вставляю пустой список в качестве параметра, я получаю эту ошибку:
стандартный ввод (78,1): ошибка FS0030: ограничение значения. Значение 'it' было выведено, чтобы иметь общий тип
val it: '_a list Либо определите' it 'как простой термин данных, сделайте его функцией с явными аргументами или, если вы не собираетесь использовать его как универсальный, добавьте аннотацию типа.
Помогите, кто-нибудь?
1 ответ
Пустой список ([]
) совершенно особенный; это может быть список любого типа. Поэтому компилятор жалуется, что у вас нет определенного типа для []
, Добавление аннотации типа к аргументу помогает решить проблему:
let results = removeEven ([]: int list)
или больше идиоматических аннотаций типа, как предложено @kvb:
let results: int list = removeEven []
Это, вероятно, не подлежит сомнению, но ваша функция должна быть названа как removeOdd
поскольку индексы часто начинаются с 0
и ваша функция удаляет все элементы с нечетными индексами. Более того, все становится намного понятнее, если вы используете сопоставление с образцом в первых двух элементах списка, а не ведете счетчик. x
для проверки показателей:
let rec removeOdd = function
| [] -> []
| [x] -> [x]
| x::_::xs -> x::removeOdd xs