F# Seq.choose() 错误 FS0001

F# Seq.choose() Error FS0001

我已经在 .fsx 文件和 Visual Studio 的交互式 window 中尝试了 MSDN 的 example 的 Seq.choose 函数(写在下面),但它反复returns 错误 FS0001,说明 "None" 选项是 PageExt 类型而不是抽象选项类型 'a 选项。

我徒劳地搜索了 PageExt 类型的解释,或者为什么当 None 关键字应该只代表匹配表达式中的 "no value" 选项时这可能会返回错误。

let numbers = seq {1..20}
let evens = Seq.choose(fun x -> 
                               match x with
                               | x when x%2=0 -> Some(x)
                               | _ -> None ) numbers
printfn "numbers = %A\n" numbers
printfn "evens = %A" evens
;;

                                  | _ -> None ) numbers
  ---------------------------------------^^^^
> 

C:Path\stdin(38,40): error FS0001: This expression was expected to have type
    'a option    
but here has type
    PageExt 

感谢任何人提供的帮助!

PageExt 类型很可能是您之前拉入当前 FSI 会话的东西,它绑定了一些东西到 None,基本上阻止了 FSI 识别正常的期权类型。

在 F# 中,您可以重复使用 "shadows" 原始值的名称。例如,在 FSI 中,如果您键入:

let a = 1;;
let a = 2.3;;
a;;

您会注意到它显示:

val a : int = 1

然后

val a : float = 2.3

终于

val it : float = 2.3

这并没有改变 a 的定义,而是定义了一个新的 a 名称来隐藏(或 "hides")原始绑定值。

在你的例子中,你有一个 None 名称绑定到具有 PageExt 类型的东西,该类型正在隐藏 Option.None,阻止它可用。

解决此问题的最简单方法是重置您的 FSI 会话。右键单击 F# Interactive window,然后选择 "Reset iteractive session"。如果您这样做,那么 运行 您粘贴的代码将正常工作。