我有一个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:列表将"it"定义为一个简单的数据术语,使它是一个带有显式参数的函数,或者,如果您不打算这样做的话要通用,请添加类型注释。
救命,有人吗?
空列表([]
)非常特殊;它可以是任何类型的列表。因此,编译器会抱怨您没有[]
的特定类型。在参数上添加类型注释有助于解决问题:
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