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