SORU
16 Aralık 2010, PERŞEMBE


Ne Scala içerik ve görünüm sınırları?

Basit bir şekilde, içerik ve görünüm sınırları nelerdir ve aralarında ne fark var?

Kolay takip bazı örnekler harika olurdu!

CEVAP
17 Aralık 2010, Cuma


Bu zaten istendi, ama eğer öyleyse, soru "" bar. ile ilgili olarak belli değil sanıyordum Yani, işte burada:

Bir Görünüm Bağlı nedir?

Birgörünüm bağlıbir mekanizma Scala 14 ** bazı tip kullanmak isteyenler için kullanılmaya başlandıgibi15* *bazı tip vardı. Tipik sözdizimi şudur:

def f[A <% B](a: A) = a.bMethod

Diğer bir deyişle, A bir türde bir nesne üzerinde B yöntemleri arayabilmesi B örtülü bir dönüştürme kullanılabilir olmalı, A. Görünümü en yaygın kullanımı standart kütüphanede (2.8.0, neyse Scala önce) sınırları, Ordered ile

def f[A <% Ordered[A]](a: A, b: A) = if (a < b) a else b

Bir Ordered[A] tanımlar Ordered[A] ve yöntemi <(other: A): Boolean, bir A dönüştürebilirsiniz çünkü ifade a < b kullanabilirim.

view bounds are deprecated bunları yapmaktan kaçınmak gerekir unutmayın.

Bir Bağlam Bağlı nedir?

İçerik Scala sınırları içinde 2.8.0 ve genellikle sözde kullanılır tanıtıldıyazın sınıf desenişlevselliği öykünen bir kod desen daha ayrıntılı bir şekilde Haskell tür dersleri de verilir.

Bir görünüm bağlı basit türleri (örneğin, A <% String) ile kullanılabilir, ancak bir bağlam bağlı bir gerektirirparametreli yazın, Ordered[A] yukarıdaki gibi, ama String aksine.

Bir bağlam bağlı örtülü açıklardeğergörünüm yerine üstü kapalı bağlıdönüşüm. Bazı türü için A, 32 ** türü mevcut örtülü bir değer olduğunu bildirmek için kullanılır. Sözdizimi şöyle:

def f[A : B](a: A) = g(a) // where g requires an implicit value of type B[A]

Bu görünüm hemen nasıl kullanılacağı belli değil, çünkü bağımlı daha kafa karıştırıcı. Scala kullanımı yaygın örneğidir bu

def f[A : ClassManifest](n: Int) = new Array[A](n)

Parametrik türü Array başlatma ClassManifest mevcut, gizli sebep türü silme ve diziler olmayan silme doğa ile ilgili olması gerekir.

Kütüphanede çok yaygın bir örnek biraz daha karmaşık

def f[A : Ordering](a: A, b: A) = implicitly[Ordering[A]].compare(a, b)

Burada, implicitly örtülü değeri istiyoruz yazın birini almak için kullanılır 40* *yöntemi tanımlayan Ordering[A],.

Aşağıda, bunu yapmanın başka bir yolu göreceğiz.

Nasıl Sınırları ve İçerik Sınırları Görünüm uygulanır?

Hem görünüm sınırları ve içerik sınırları kapalı parametreleri ile uygulanan şaşırtıcı, onların şekil verdik olmamalı. Aslında gösterdiğim sözdizimi gerçekten ne için sözdizimsel şeker. Nasıl de-şeker aşağıya bakın:

def f[A <% B](a: A) = a.bMethod
def f[A](a: A)(implicit ev: A => B) = a.bMethod

def g[A : B](a: A) = h(a)
def g[A](a: A)(implicit ev: B[A]) = h(a)

Bu yüzden, doğal olarak, bağlam sınırları için özellikle faydalı olan, tam sözdizimi onları yazabilirim:

def f[A](a: A, b: A)(implicit ord: Ordering[A]) = ord.compare(a, b)

Görünüm Sınırları ne için kullanılır?

Görünüm sınırları çoğunlukla faydalanmaya kullanılırpezevenk benim kütüphanedesen, "" varolan bir sınıf için yöntemler, özgün türü bir şekilde geri dönmek istiyorum. durumlarda ekleyen aracılığıyla Eğer herhangi bir şekilde bu tip geri dönmek için ihtiyacınız yoksa, o zaman bir görünüm bağlı gerekmez.

Görünüm bağlı kullanım klasik örneği Ordered kullanım. Int örtülü bir dönüşüm olmasına rağmen 45**, örneğin, unutmayın. Örneğin, daha önce ihtiyaçlarını bir görünümü olmayan dönüştürülmüş tür verir çünkü oluşturulmasıyla:

def f[A <% Ordered[A]](a: A, b: A): A = if (a < b) a else b

Bu örnek görünüm sınırları olmadan işe yaramaz. Eğer başka bir tür dönmek için olsaydı, ancak daha sonra bir görünüm artık bağlı ihtiyacım yok:

def f[A](a: Ordered[A], b: A): Boolean = a < b

Dönüşüm burada (gerekirse) f bunu bilmesine gerek yok yani f, parametre geçiyorum önce olur.

Ordered, ayrıca kütüphaneden en yaygın kullanımı Scala koleksiyonları gibi String ve Java sınıfları olan Array, işleme. Örneğin:

def f[CC <% Traversable[_]](a: CC, b: CC): CC = if (a.size < b.size) a else b

Eğer bir görünüm sınırları olmadan bunu yapmak için çalıştı, String bir dönüş türü Array WrappedString (2.8 Km), ve benzer bir şey olurdu.

Aynı şey bu tür sadece dönüş tipi bir parametre olarak kullanılması durumunda bile olur:

def f[A <% Ordered[A]](xs: A*): Seq[A] = xs.toSeq.sorted

İçerik Sınırları ne için kullanılır?

İçerik sınırları esas olarak tanıdığı olmak içinde kullanılırtypeclass desenörnek olarak Haskell için bu tür sınıflar. Temel olarak, bu deseni işlevselliği örtülü adaptör desen bir tür aracılığıyla yaparak miras alternatif uygular.

Klasik örnek Scala Scala kütüphane boyunca Ordered yerine 2.8 Ordering. Kullanımı:

def f[A : Ordering](a: A, b: A) = if (implicitly[Ordering[A]].lt(a, b)) a else b

Genellikle bu gibi yazılı olduğunu göreceksin ama

def f[A](a: A, b: A)(implicit ord: Ordering[A]) = {
    import ord.mkOrderingOps
    if (a < b) a else b
}

Geleneksel operatör stili sağlayan Ordering içinde bazı örtülü dönüşüm yararlanın. Scala 2.8 başka bir örnek Numeric:

def f[A : Numeric](a: A, b: A) = implicitly[Numeric[A]].plus(a, b)

Daha karmaşık bir örnek CanBuildFrom ama burada uzak dururum o yüzden zaten bu konuda çok uzun bir cevabı var, yeni koleksiyon kullanımıdır. Ve, daha önce belirtildiği gibi, beton türleri olmadan yeni diziler başlatmak için gerekli olan ClassManifest kullanımı var.

Bağlamında bağlı olan typeclass desen çok daha muhtemel olmak üzere, kendi sınıfları olarak devreye ayrılık kaygıları, oysa görüntülemek sınırları olabilir Kaçınılması kendi koduna göre iyi bir tasarım (çoğunlukla etrafta başka birinin tasarımı).

Uzun bir süre için mümkün oldu ama, bağlam sınırları kullanmak aslında Scala'nın en önemli kütüphaneler ve çerçeveler çoğu 2010 ve şimdi bir dereceye kadar bulunan içinde kapalı almıştır. Kullanımı en uç örnek olsa da, Haskell gücü bir sürü Scala getiren Scalaz kütüphane. Typeclass desenleri daha yakından tanımak için okunması tavsiye edilen bu kullanılabilir tüm yolları.

EDİT

Faiz ile ilgili soruları:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BetterCoder

    BetterCoder

    17 Aralık 2012
  • FND Films

    FND Films

    2 Mayıs 2006
  • Showtime

    Showtime

    21 HAZİRAN 2006