2015-07-06 16 views
10

Birkaç yıldır F # programlıyorum ve bir süredir beni rahatsız eden bir "sorun" var ve çözemedim. Bu bir hata değil, bence bu bir tasarım kararıdır, ama yine de sorun şu: bu bir gecikme yolu var mı (belki de bunun için doğru kelime değil) arayüzlerin uygulanması ?, yani onları uygulamamaktadır. İlk tanımda, ancak daha sonra, belki de aynı dosyada, tür için bir modül uyguladıktan sonra. Ben basitleştirilmiş bir örnekle açıklayacağız: Bak burada yöntem uygulanırsaArabirim yöntemlerinin uygulanmasını geciktirin mi?

type 'T MyCollection = 
     (*type definition*) 
     interface IEnumerable<'T> with 
      member this.GetEnumerator() = 
       (* I don't want to implement it here 
        because I still don't have the module 
        with a toSeq function *) 

, ben de o zaman tipi ve yöntemleri gibi tüm fonksiyonlarını uygulamak zorunda kalacak: Aşağıdaki veri yapısını olduğunu varsayalım Modül, yöntemleri çağırmak için sadece bir "proxy" olur. Bu şekilde, bir OO-ilk veri yapısı oluşturuyorum ve daha sonra işlevsel-ilk kullanım için izin vermek için bir modül (tür ek açıklamaları ile aşırı) oluşturuyorum. İşlevsel bir veri yapısı (tip çıkarımı daha iyi çalışabileceğinden temizleyici) yazmayı ve daha sonra C# gibi diller için daha iyi bir intellisense desteği sağlamak için bir OO sarıcı oluşturmayı tercih ederim. Bu yaklaşım, F # için tasarım yönergelerinin bize ne ifade ettiği ile uyumludur, ancak arayüzler herhangi bir yerde değil, türün ilk tanımında uygulanamaz. Bu kısıtlama, tüm veri yapısını üyelerle yazmamı zorlaştırıyor. Örnekler arıyorum ve FSharp.Core list'daki liste uygulamasının tam olarak istediğimi yaptım, ancak bunu yapamam, derleyicinin izin vermeyeceğini buldum. Bunun bir tasarım kararı olduğuna eminim, belki de kötü uygulamaları cesaretlendirmekten kaçınmak için, bilmiyorum ama kötü bir uygulama olma isteğimi düşünmüyorum. Ayrıca fsharp derleyicinin doğrusal doğasından da haberdarım.

İstediğinizi nasıl yapacağınızı biliyorsanız lütfen bana söylerseniz sevinirim. Ayrıca, herhangi biriniz bu yaklaşımı neden takip etmem gerektiğini biliyorsam, ben de bilmekten memnun olurum. Bunun bir başkası için sorun olmamasının bir nedeni olmalı.

Şimdiden teşekkürler.

cevap

9

Bunun tamamen talihsiz bir problem olduğuna katılıyorum. F # Çekirdek kitaplığındaki 'a list kaynak kodunda kullanılan numara, tür yükseltme'da arabirimin uygulanmasını tanımlamaktır. Bu şekilde bir üye eklediğinizde derleyici şikayette bulunmaz, ancak bu şekilde bir arabirimin uygulanmasının eklenmesi önerilmemektedir. Ancak, bunu yapmanı engellemez. şu benim için iyi derler:

open System.Collections 
open System.Collections.Generic 

type MyCollection<'T> = 
    { Data : 'T list } 
    interface IEnumerable<'T> 
    interface IEnumerable 

let getEnumerator { Data = d } = 
    (d :> seq<_>).GetEnumerator() 

type MyCollection<'T> with 
    interface IEnumerable<'T> with 
    member this.GetEnumerator() = getEnumerator this 
    interface IEnumerable with 
    member this.GetEnumerator() = (getEnumerator this) :> _ 

bu kullanımdan kaldırıldı aslında biraz talihsizlik. Bu stili çok beğendim ve mantıklı olduğunda kullanıyorum. start a discussion about this on F# user voice yapabilir ve belki de normal kabul edilen bir özelliğe dönüşebilir :-)

+0

Cevabınız için teşekkürler, anladığım kadarıyla yanlış anlayabildiğim için çok utanıyordum. Şimdiye kadar kendi başıma bu konuyla ilgilenmiştim çünkü tüm F # kodlarım özel kullanım içindi OO dilleri için iyi bir arayüz sağlamak zorunda kalmadım. Ancak son zamanlarda bir SkewBinomialHeap uygulamasının fsharpx.collections'a (hala bir çekme isteğinde) ekledim ve bunu daha geleneksel ve herkes tarafından kabul edilebilir bir şekilde ele almak zorunda kaldım. –

+0

Evet, bu çözüm mükemmel çalışıyor. Ama korkarım ki, dilin gelecekteki bir versiyonunda, kullanımdan kaldırılmış olandan yasadışıya geçebilir. Tekrar teşekkürler. –

+0

[Kullanıcı sesi gönderildi] (http://fslang.uservoice.com/forums/245727-f-language/suggestions/8733178-revert-back-to-an-accepted-feature-the-delayed-imp) –

İlgili konular