空列表中的F#值限制

时间:2012-02-23 12:54:09

标签: list f# value-restriction

我有一个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   它是一个带有显式参数的函数,或者,如果你不打算这样做   要是通用的,添加一个类型注释。

帮助,任何人?

1 个答案:

答案 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