Ограничение значения F # в пустом списке - PullRequest
5 голосов
/ 23 февраля 2012

У меня есть функция 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'], что я должен.Но когда я вставляю пустой список в качестве параметра, я получаю эту ошибку:

stdin (78,1): ошибка FS0030: ограничение значения.Значение 'it' было выведено, чтобы иметь универсальный тип

val it: '_a list Либо определите' it 'как простой термин данных, сделайте его функцией с явными аргументами или, если вы не собираетесь использоватьэто должно быть общим, добавить аннотацию типа.

Помогите, кто-нибудь?

1 Ответ

7 голосов
/ 23 февраля 2012

Пустой список ([]) совершенно особенный;это может быть список любого типа.Поэтому компилятор жалуется, что у вас нет определенного типа для [].Добавление аннотации типа к аргументу помогает решить проблему:

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
...