Midoliy |> F# - フレキシブル型
フレキシブル型
Midoliy|F#プログラミング
フレキシブル型の概要
サンプルでみるフレキシブル型

フレキシブル型の概要


 フレキシブル型注釈は、パラメータ・変数・値の互換性がクラスまたはインターフェースのオブジェクト指向階層内(= 継承ツリー内)の型にあることを示します。フレキシブル型は、型階層の上位の型への自動変換は行われませんが、階層内の任意の型、またはインターフェースを実装する型で機能を有効にしたい際に特に便利です。
// ------------------
// [ 構文 ]
// ------------------
#type
 構文中の「type」は基底型またはインターフェース型を表します。フレキシブル型は、許容する型を「基底型またはインターフェース型と互換性のある型」に制限する制約を持つジェネリック型と同等です。つまり、以下のコードは同等の意味を持ちます。
// フレキシブル型
#SomeType

// ジェネリック制約
'T when 'T :> SomeType


サンプルでみるフレキシブル型


 フレキシブル型はいくつかの状況で役にたちます。たとえば、高階関数にフレキシブル型を返させると便利なことがよくあります。次の例ではseqをフレキシブル型として使用することで、seq型は元より、リスト型、配列型、およびその他の列挙可能な型を返す関数を引数に渡すことが可能です。


 iterate1()関数では、引数に【seq<int>】を返す関数しか指定することができません。しかし、iterate2()関数では【seq<int>と互換性のある型】を返す関数であればなんでも指定することが可能です。seqはIEnumerableインターフェースと同義ですので、リスト型や配列型、IEnumerableインターフェースを実装する型であれば指定できるわけですね(参考)。
 また、コードを見てみるとわかるとおり、明示的なキャストがないためフレキシブル型を利用しているiterate2()関数の利用例の方がスッキリしていると思います。このように余計な処理がないほうが可読性が向上するため、利用できるシーンでは積極的に利用していくとよいでしょう。