我已经在 .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/