use*_*614 5 f# list 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
Run Code Online (Sandbox Code Playgroud)
它会删除列表中偶数索引处的所有元素.它是有效的,如果我给列表一些输入,就像removeEven ['1';'2';'3']我得到['1';'3']我应该的.但是当我插入一个空列表作为参数时,我收到此错误:
stdin(78,1):错误FS0030:值限制.值'it'被推断为具有泛型类型
val it:'_ a list将'it'定义为一个简单的数据项,使其成为具有显式参数的函数,或者,如果您不打算将其作为泛型,则添加类型注释.
帮忙,有人吗?
空列表([])非常特别; 它可以是任何类型的列表.因此,编译器抱怨您没有特定类型[].在参数上添加类型注释有助于解决问题:
let results = removeEven ([]: int list)
Run Code Online (Sandbox Code Playgroud)
或@kvb建议的更多惯用类型注释:
let results: int list = removeEven []
Run Code Online (Sandbox Code Playgroud)
这可能是不可能的,但是你的函数应该被命名为removeOdd因为索引通常从索引开始0并且你的函数删除所有带有奇数索引的元素.而且,如果你在列表的前两个元素上使用模式匹配而不是保留一个x用于检查索引的计数器,事情会更清楚:
let rec removeOdd = function
| [] -> []
| [x] -> [x]
| x::_::xs -> x::removeOdd xs
Run Code Online (Sandbox Code Playgroud)