类型不匹配Seq.unfold

时间:2012-03-20 14:13:25

标签: f# f#-interactive

let fibgen (x,y) = if(x < 4000000) then Some(x+y, (y, x+y)) else None

let fibseq = Seq.unfold fibgen (1,1)
  

第二行输入不匹配错误。我做错了什么?我正在使用F#2.0

答案

  

我的交互式窗口上的第一个重置重置会话仍然是相同的错误
  然后重新启动我的项目现在工作正常。

     

是的,我在同一会话中执行了下面的代码

// The option type is a discriminated union.
type Option<'a> =
    | Some of 'a
    | None




Interactive window Output as below

val fibgen : int * int -> Option<int * (int * int)>

> 


Eluer2.fs(27,25): error FS0001: Type mismatch. Expecting a
    int * int -> ('a * (int * int)) option    
but given a
    int * int -> Option<int * (int * int)>    
The type '('a * (int * int)) option' does not match the type 'Option<int * (int * int)>'
> 

1 个答案:

答案 0 :(得分:4)

正如Carsten在评论中指出的那样,如果您在干净的F#Interactive中输入代码,代码就可以正常工作。由于编译器抱怨Option<'T>'T option不匹配,我猜你在使用{{1}之前不小心写了一些重新定义SomeNone的代码功能。也许你写了这样的东西(并在F#Interactive中评估过):

unfold

这隐藏了type Option<'T> = | None | Some of 'T Some的标准定义,它们是标准F#库中定义的None类型的构造函数('T option函数所期望的)。

您可以通过右键单击窗口并选择“重置会话”来重置F#Interactive会话。这将删除以前的声明,代码应该可以正常工作。