2013-05-21 13 views
12

私の最初のF#の日。私は、このお持ちの場合:F#の `is`はC#のキーワードですか?

let cat = Animal() 

catisAnimal場合は今どのように私は、後の段階でチェックしますか? F#ので

のC#で

bool b = cat is Animal; 

?唯一のデモンストレーションのために

+9

'let b = cat:? Animal' – ildjarn

+4

@ildjarnあなたはコメントの代わりに答えとしてそれを追加して受け入れることができます。 –

+1

@ジャック:モバイルでは、私は徹底的な答えを与えることはできません。どうぞ。 : - ] – ildjarn

答えて

21

@ildjarnは、最初に答えるために、ここでの信用に値するが、それは受け入れることができるので、私はここで答えを提出しています。

F#相当のC#isキーワードは、:?です。例:

let cat = Animal() 
if cat :? Animal then 
    printfn "cat is an animal." 
else 
    printfn "cat is not an animal." 
8

is関数を定義していない):

let is<'T> (x: obj) = x :? 'T 

type Animal() = class end 
type Cat() = inherit Animal() 

let cat = Cat() 
cat |> is<Animal> //true 
+0

ダニエル、 '|>'は何か教えてくれますか?なぜ関数呼び出しの前にそれを含めるべきですか?名前はありますか? – nawfal

+2

これは、フォワードパイプ演算子と呼ばれます。これは、右側の関数の最後の引数として左のオペランドを適用します。 ([MSDN](http://msdn.microsoft.com/en-us/library/ee340273.aspx)を参照してください) – Daniel

+0

ダニエル、なぜあなたは関数として定義されていない、私にはかなり便利に見えますか? – sacha

3

私は遅刻していることを知っています。 fsiでコレクションのタイプをテストしようとすると:? アイテムタイプが一致しない場合、エラーが発生します。例えば。

let squares = seq { for x in 1 .. 15 -> x * x } 
squares :? list<int> ;; // will give false 
squares :? list<string> ;; // error FS0193: Type constraint mismatch 

Danielsのような関数でのラッピングは、< 'T>が動作します。

関連する問題