2016-06-21 7 views
3

MSDNのexampleは、以下のSeq.choose関数(下記)を.fsxファイルとVisual Studioの対話型ウィンドウで試しましたが、エラーFS0001を繰り返し返します"None"オプションは、抽象的なオプションタイプ 'aオプションではなく、PageExtタイプです。F#Seq.choose()エラーFS0001

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 

ありがとうございました!

+8

これは、あなたが 'PageExt'と呼ばれる型を持っているように聞こえます。インタラクティブウィンドウを右クリックし、[セッションをリセット]をクリックします。 –

答えて

8

PageExtタイプは、あなたが現在にバインドしていた現在のFSIセッションに引っ張ってしまった可能性があります。これは、FSIが通常のオプションタイプを認識することを基本的に阻止します。

F#では、元の値を「陰影付け」する名前を再利用することができます。例えば、FSIに、あなたが入力した場合:

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

あなたはそれが表示されていることに気づくでしょう:次に

val a : int = 1 

最後に

val it : float = 2.3 

このISN

val a : float = 2.3 

の定義を変更していませんむしろオリジナルの境界値をシャドウ(または「隠す」)の新しい名前を定義しています。

PageExtタイプのものにバインドされている名前はNoneであり、使用できないようにするには、シャドーイングOption.Noneを使用します。

これを修正する最も簡単な方法は、FSIセッションをリセットすることです。 F#インタラクティブウィンドウを右クリックし、「反復的セッションをリセット」を選択します。そうしたら、貼り付けたコードを実行すれば正常に動作します。

+1

ターゲット上で右クリックします。ありがとうございました! –