我有一个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:值限制。价值'它'已经 推断为具有泛型类型
val it:'_ a list将'it'定义为一个简单的数据术语,make 它是一个带有显式参数的函数,或者,如果你不打算这样做 要是通用的,添加一个类型注释。
帮助,任何人?
答案 0 :(得分:7)
空列表([]
)非常特别;它可以是任何类型的列表。因此,编译器会抱怨您没有[]
的特定类型。在参数上添加类型注释有助于解决问题:
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