List 空列表中的F#值限制
我有一个F#函数:List 空列表中的F#值限制,list,f#,value-restriction,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)
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']
。但当我插入一个空列表作为参数时,我得到了以下错误:
标准输入(78,1):错误FS0030:值限制。“it”的值已更改
推断为具有泛型类型
val it:“\u列表可以将“it”定义为一个简单的数据项,或者
它是一个带有显式参数的函数,或者,如果您不打算这样做的话
要成为泛型,请添加类型批注
有人帮忙吗?空列表([]
)很特别;它可以是任何类型的列表。因此,编译器抱怨您没有[]
的特定类型。在参数上添加类型批注有助于解决此问题:
let results = removeEven ([]: int list)
或@kvb建议的更多惯用类型注释:
这可能是不可能的,但您的函数应命名为removeOdd
,因为索引通常从0
开始,并且您的函数将删除所有具有奇数索引的元素。此外,如果您在列表的前两个元素上使用模式匹配,而不是保留一个计数器x
来检查索引,则情况会更加清楚:
let rec removeOdd = function
| [] -> []
| [x] -> [x]
| x::_::xs -> x::removeOdd xs
空列表([]
)非常特殊;它可以是任何类型的列表。因此,编译器抱怨您没有[]
的特定类型。在参数上添加类型批注有助于解决此问题:
let results = removeEven ([]: int list)
或@kvb建议的更多惯用类型注释:
这可能是不可能的,但您的函数应命名为removeOdd
,因为索引通常从0
开始,并且您的函数将删除所有具有奇数索引的元素。此外,如果您在列表的前两个元素上使用模式匹配,而不是保留一个计数器x
来检查索引,则情况会更加清楚:
let rec removeOdd = function
| [] -> []
| [x] -> [x]
| x::_::xs -> x::removeOdd xs
请注意,您也可以直接将注释添加到
结果
,这可能更为惯用。当参数为[]
时,建议的removeOdd函数将失败。我试图以一种通用的方式解决这个问题,但如果没有“error FS0030:Value restriction”,我无法处理[]
案例。有可能使这样的函数真正通用吗?请注意,您也可以直接将注释添加到结果
,这可能更为惯用。当参数为[]
时,建议的removeOdd函数将失败。我试图以一种通用的方式解决这个问题,但如果没有“error FS0030:Value restriction”,我无法处理[]
案例。有可能使这种功能真正通用吗?