2016-06-21 22 views
3

我已經在Visual Studio的.fsx文件和交互式窗口中爲Seq.choose函數(寫在下面)嘗試了MSDN的example,但它多次返回錯誤FS0001,指出「無」選項是PageExt類型而不是「抽象選項類型」選項。F#Seq.choose()錯誤FS0001

我已經搜索了一個關於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 

感謝任何人的幫助!

+8

這聽起來非常像你有一個定義爲'PageExt'的類型,其中一個聯合事例被稱爲'None'。右鍵單擊到您的交互式窗口中,單擊「重置會話」 –

回答

8

PageExt類型可能是您之前拉入當前FSI會話的某些東西綁定到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 

這ISN不會改變的定義,而是定義一個新的a名稱,該名稱會影響(或「隱藏」)原始綁定值。

對於您的情況,您有一個None名稱,該名稱與PageExt類型綁定,該類型的影響是Option.None,阻止它可用。

解決此問題的最簡單方法是重置您的FSI會話。右鍵單擊F#交互式窗口,然後選擇「重置迭代會話」。如果你這樣做,然後運行你粘貼的代碼,它會正常工作。

+1

正確的目標。謝謝! –