Saya melihat kode ini di blog ini: Pemrograman Tipe-Level di Scala :
// define the abstract types and bounds
trait Recurse {
type Next <: Recurse
// this is the recursive function definition
type X[R <: Recurse] <: Int
}
// implementation
trait RecurseA extends Recurse {
type Next = RecurseA
// this is the implementation
type X[R <: Recurse] = R#X[R#Next]
}
object Recurse {
// infinite loop
type C = RecurseA#X[RecurseA]
}
Ada operator #
dalam kode R#X[R#Next]
yang belum pernah saya lihat. Karena sulit untuk mencarinya (diabaikan oleh mesin pencari), siapa yang dapat memberi tahu saya apa artinya?
scala
type-systems
Jalan bebas
sumber
sumber
Jawaban:
Untuk menjelaskannya, pertama-tama kita harus menjelaskan kelas bersarang di Scala. Pertimbangkan contoh sederhana ini:
Sekarang mari kita coba sesuatu dengannya:
Ketika Anda mendeklarasikan kelas di dalam kelas lain di Scala, Anda mengatakan bahwa setiap instance dari kelas itu memiliki subclass seperti itu. Dengan kata lain, tidak ada
A.B
kelas, tetapi adaa1.B
dana2.B
kelas, dan mereka adalah kelas yang berbeda , seperti pesan kesalahan memberitahu kita di atas.Jika Anda tidak mengerti itu, cari tipe jalan yang tergantung.
Sekarang,
#
buatlah kemungkinan bagi Anda untuk merujuk ke kelas bertingkat seperti itu tanpa membatasi ke instance tertentu. Dengan kata lain, tidak adaA.B
, tapi adaA#B
, yang berartiB
kelas bersarang dari setiap contohA
.Kita dapat melihat ini sedang bekerja dengan mengubah kode di atas:
Dan mencobanya:
sumber
Class
adalah representasi runtime dari kelas Java, dan terbatas bahkan di Jawa. Misalnya,List<String>
danList<Integer>
memiliki runtime yang samaClass
. JikaClass
tidak cukup kaya untuk mewakili tipe Java , hampir tidak ada gunanya saat mewakili tipe Scala . Sekali lagi,res7: Class[A#B] = class A$B
kiri tanda sama dengan adalah tipe, kanan dari sama dengan jika nilai yang merupakan representasi runtime Java dari suatu kelas.Ini dikenal sebagai tipe proyeksi, dan digunakan untuk mengakses anggota tipe.
sumber
Pada dasarnya, ini adalah cara merujuk ke kelas dalam kelas lain.
http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html (cari "pound")
sumber
Berikut adalah sumber daya untuk mencari di "operator simbolik" (yang benar-benar metode), tapi saya belum menemukan cara untuk melarikan diri "#" untuk mencari di scalex)
http://www.artima.com/pins1ed/book-index.html#indexanchor
sumber