Scala'nın yola bağlı türleri ile kastedilen nedir?


125

Scala'nın yola bağlı türleri olduğunu duydum. Bu iç sınıflarla ilgili bir şey ama bu gerçekte ne anlama geliyor ve neden umursuyorum?


2
@Michel - PDT'lerin ne olduğunu bile biliyorum; SO'nun bir cevapla zenginleştirilebileceğini umuyordum!
oxbow_lakes

1
Ben kısaca cevap PDT hakkında CH12 okuduktan sonra orada umut
istifleyici

Yanıtlar:


165

En sevdiğim örnek:

case class Board(length: Int, height: Int) {
  case class Coordinate(x: Int, y: Int) { 
    require(0 <= x && x < length && 0 <= y && y < height) 
  }
  val occupied = scala.collection.mutable.Set[Coordinate]()
}

val b1 = Board(20, 20)
val b2 = Board(30, 30)
val c1 = b1.Coordinate(15, 15)
val c2 = b2.Coordinate(25, 25)
b1.occupied += c1
b2.occupied += c2
// Next line doesn't compile
b1.occupied += c2

Dolayısıyla, türü , somutlaştırıldığı Coordinateörneğe bağlıdır Board. Bununla başarılabilecek her tür şey vardır, değerlere bağlı olan ve tek başına türlere bağlı olmayan bir tür güvenlik sağlar.

Bu bağımlı tipler gibi gelebilir, ancak daha sınırlıdır. Örneğin, türü occupieddeğerine bağlıdır Board. Tipi nedeniyle Yukarıda, son satırı değil çalışır c2olduğunu b2.Coordinateederken, occupied'ın türüdür Set[b1.Coordinate]. Birinin aynı türde başka bir tanımlayıcı kullanabileceğine dikkat edin b1, bu nedenle türle b1 ilişkili tanımlayıcı değildir . Örneğin, aşağıdaki çalışır:

val b3: b1.type = b1
val c3 = b3.Coordinate(10, 10)
b1.occupied += c3

2
Cevap için +1. Son cümleyi kafa karıştırıcı buldum: 'Yalnızca türlere değil, değerlere bağlı güvenlik yazın' diyorsunuz. Bana göre bu bağımlı tipler gibi görünse de yola bağlı tipler kendi başına değerlere bağlı değildir. Sence de kafa karıştırıcı mı?
Matthew Farwell

4
Ben ne söylediğini anlamaya @Matthew, fakat yolu bağımlı tip yapmak normalde bağımlı tipleri ile ilişkili esneklik sağlamaz bile değerlere bağlı.
Daniel C. Sobral

1
Kesinlikle, demek istediğim bu. Başlangıçta türün b1 / b2'ye değil, kurucuya iletilen değerlere bağlı olduğunu okudum. Şimdi anlıyorum, ama almam birkaç okumamı aldı.
Matthew Farwell

3
En kolay açıklama, yola bağımlı türlerin yalnızca kapanışları olan sınıflar olmasıdır, tam olarak işlevlerin değişkenleri kapsamdan bağlayabilmesiyle aynı şekilde.
polkovnikov.ph

1
Ancak bu benzetmenin belki de temel bir farkı vardır: Bir bağlama çalışma zamanında (kapanışlar için) ve diğer bağlama derleme zamanında (yola bağlı türler için) gerçekleşir.
jhegedus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.