Wil*_*orn 3 msdn f# sequence match
我已经在.fsx文件和Visual Studio的交互式窗口中尝试了MSDN的Seq.choose函数示例(如下所示),但它反复返回错误FS0001,声明"None"选项是PageExt类型而不是抽象选项类型'一个选项.
我徒劳地搜索了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
Run Code Online (Sandbox Code Playgroud)
感谢任何人都能提供的帮助!
这种PageExt类型很可能是你之前已经进入当前FSI会话的东西None,它会阻止FSI识别正常的选项类型.
在F#中,您可以重用名称,这会"隐藏"原始值.例如,在FSI中,如果键入:
let a = 1;;
let a = 2.3;;
a;;
Run Code Online (Sandbox Code Playgroud)
你会注意到它显示:
val a : int = 1
Run Code Online (Sandbox Code Playgroud)
然后
val a : float = 2.3
Run Code Online (Sandbox Code Playgroud)
最后
val it : float = 2.3
Run Code Online (Sandbox Code Playgroud)
这不是改变定义a,而是定义一个a阴影(或"隐藏")原始边界值的新名称.
在您的情况下,您有一个None名称,该名称绑定到具有PageExt遮蔽Option.None类型的某些内容,从而阻止其可用.
解决此问题的最简单方法是重置您的FSI会话.右键单击F#Interactive窗口,然后选择"重置迭代会话".如果你这样做,那么运行你粘贴的代码,它将正常工作.