我已经在 .fsx 文件和 Visual Studio 的交互式窗口中为 Seq.choose 函数(写在下面)尝试了 MSDN 的 example,但它反复返回错误 FS0001,指出“无”选项是 PageExt 类型而不是抽象选项类型 'a 选项。

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

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 session 的内容,它将某些内容绑定(bind)到 None ,从本质上阻止 FSI 识别正常的选项类型。

在 F# 中,您可以重用名称,这些名称“隐藏”了原始值。例如,在 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 名称来隐藏(或“隐藏”)原始绑定(bind)值。

在您的情况下,您有一个 None 名称,该名称绑定(bind)到具有 PageExt 类型的东西,该类型遮蔽了 Option.None,从而使其无法使用。

解决此问题的最简单方法是重置您的 FSI session 。在 F# 交互窗口中右键单击,然后选择“重置迭代 session ”。如果你这样做,然后运行你粘贴的代码,它会正常工作。

关于F# Seq.choose() 错误 FS0001,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37953744/

10-14 02:35