7

我有一个 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' 定义为一个简单的数据项,使其成为具有显式参数的函数,或者,如果您不希望它是通用的,则添加一个类型注释。

帮忙,有人吗?

4

1 回答 1

10

空列表 ( []) 很特别;它可以是任何类型的列表。因此,编译器会抱怨您没有特定的[]. 在参数上添加类型注释有助于解决问题:

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
于 2012-02-23T13:06:04.363 回答