2016-06-01 8 views
6

これは純粋に学問的な質問ですが、タイプ制約についてはthis question のようになります。質問者はこれを例として与えました:再帰型制約を持つオブジェクトを作成することはできませんか?

type Something<'a, 'b when 'b :> seq<'b>>() = 
    member __.x = 42 

f#がうれしくコンパイルされます。今問題はどうやってこのオブジェクトを作るのですか?ここで

let z = new Something<???, ???>() 
+3

は非不自然例えばhttps://msdn.microsoft.com/en-us/library/documentformat.openxml.openxmlelement(v=office.14).aspxを参照してください。使用できるクラス。 – kvb

+1

「Impossible」という単語を削除するにはタイトルを変更する必要があります。「この人の周りで頭を上げることはできません」 –

+0

@kvbそうです。 'let z = new Something ()'は – Ray

答えて

3

が一つの方法です:代わりに空のシーケンスを返す

open System.Collections.Generic 

type Node<'a>() = 
    let getEmptyEnumerator() = Seq.empty<Node<'a>>.GetEnumerator() 
    interface IEnumerable<Node<'a>> with 
     member this.GetEnumerator() = getEmptyEnumerator() 
     member this.GetEnumerator() = 
      getEmptyEnumerator() :> System.Collections.IEnumerator 

、あなたは子ノードのシーケンスを戻すには、このクラスを実装することができます。このタイプはNode<'a>と呼ばれています。なぜなら、C#でツリー(またはグラフ)をモデル化するのはかなり慣用的な方法なのでです。

用途:

> let smth = Something<string, Node<int>>();;  
val smth : Something<string,Node<int>> 

> smth.x;; 
val it : int = 42 
4
type T() = 
    interface seq<T> with 
     member this.GetEnumerator() = ([] :> seq<T>).GetEnumerator() 
     member this.GetEnumerator() = ([] :> seq<T>).GetEnumerator() :> System.Collections.IEnumerator 

let z = new Something<string, T>() 
関連する問題