Ограничение значения 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
Другие вопросы по тегам