2016-06-01 14 views
6

Bu, yalnızca akademik bir sorudur, ancak tür kısıtlamaları hakkında this question kodunun silinmesini sağlar. Bu kişi, örnek olarak aşağıdakileri verdi:Yinelemeli bir tür kısıtlaması ile nesne yapmak imkansız mı?

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

hangi f # mutlu bir şekilde derler. Şimdi sorun bu nesneyi nasıl yapıyorsun?

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 

yerine boş diziyi döndürmek, alt düğümler bir dizi döndürmek için bu sınıf uygulamak olabilir

:

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

olmayan bir zoraki örneğin https://msdn.microsoft.com/en-us/library/documentformat.openxml.openxmlelement(v=office.14).aspx bakınız Kullanılabilecek bir sınıf. – kvb

+1

Belki 'İmkansız' kelimesini kaldırmak için başlığı değiştirmelisiniz, 'Bu başımı kafamı alamıyorum' ' –

+0

Kvb Haklısınız. 'let z = yeni bir şey ()' çalışır – Ray

cevap

3

İşte bir yoludur. Bu tip Node<'a>'u aradım çünkü C# içindeki bir ağacı (veya grafiği) modellemek için oldukça deyimsel bir yol.

Kullanım:

> 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>() 
İlgili konular