Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 空列表中的F#值限制_List_F#_Value Restriction - Fatal编程技术网

List 空列表中的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)

我有一个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']
。但当我插入一个空列表作为参数时,我得到了以下错误:

标准输入(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”,我无法处理
[]
案例。有可能使这种功能真正通用吗?