2014-05-22 34 views
1

我已经创建了一个返回只包含偶数索引列表的功能,如下图所示:为什么会产生价值限制例外?

let rec removeOddIdx xs = 
    match xs with 
    |[] -> [] 
    |h::t -> (if t.Length % 2 = 0 then 
       [h]@removeOddIdx t 
       else 
       removeOddIdx t) 

它正常工作时,我把它叫做:

removeOddIdx [1;2;3;];; 

然而,当我把它用空列表:

removeOddIdx [];; 

我得到一个Value Restriction异常 - 怎么回事?
我读过价值限制,但我不明白为什么发生在我的情况。

这里是精确的错误消息:

Testing.fs(13,1):错误FS0030:值限制。值'it'已经被推断为有通用型

          val it : '_a list

要么定义'it'一个简单的数据来看,使它成为一个功能有明确的参数,或者,如果你不为她打算是通用的,添加一个类型注释。

+1

嗯,我试过了,但我没有得到任何异常,编译器错误或警告。 –

+0

这很奇怪。每次运行它时,我都会收到错误(使用错误文本更新了线程)。 – user3665877

回答

1

你遇到的问题是编译器不知道什么类型给予返回值。当你通过它[1;2;3]它可以推断返回类型是int list,但如果你通过它[],返回值的类型是什么?它不能从使用情况推断,所以你会得到一个价值限制错误。

一种解决方案是给该参数的类型,像这样:

> removeOddIdx ([]:int list);; 
val it : int list = [] 

另一种方法是使特定功能而不是一般的像这样:

> let rec removeOddIdx (xs:int list) = 
    match xs with 
    |[] -> [] 
    |h::t -> (if t.Length % 2 = 0 then 
       [h]@removeOddIdx t 
       else 
       removeOddIdx t);; 

val removeOddIdx : xs:int list -> int list 

> removeOddIdx [];; 
val it : int list = [] 

外REPL的,这是不太可能成为问题,因为参数类型可能会从代码中的其他地方推断出来。

+0

啊我现在明白了。非常感谢你对它的解释! – user3665877

+0

@ user3665877没问题! – mydogisbox

相关问题