2014-10-23 2 views
0

Я начал читать скалаз source code.ScalaZ: что такое тип Tagged [T] = {type Tag = T} "?

package object scalaz { 
    import Id._ 

    implicit val idInstance: Traverse1[Id] with Each[Id] with Monad[Id] with Comonad[Id] with Distributive[Id] with Zip[Id] with Unzip[Id] with Align[Id] with Cozip[Id] = Id.id 

    type Tagged[T] = {type Tag = T} 
    . 
    . 
    . 

Как следует понимать type Tagged[T] = {type Tag = T}?

Что это значит?

Где описан этот синтаксис Scala?

Я полностью смущен этим.

Что это?

Почему?

Может ли кто-нибудь дать простой пример, который объясняет этот синтаксис для «манекенов»?

... и для чего это полезно?

+0

Вот довольно хорошее объяснение помеченных типов http://eed3si9n.com/learning-scalaz/Tagged+type.html – Noah

+0

Спасибо, это единственное, что я нашел, но проблема в том, что я слишком «фиктивный» даже для этого, я просто понятия не имею, что означает тип Tagged [T] = {type Tag = T} 'и как это работает. Я надеялся, что есть очень простое объяснение этого простого вида синтаксиса Scala. Где его значение определено? – jhegedus

ответ

3

Этого Scala структурного типирование, в основном это означает, что тип, удовлетворяющий Tagged [T] должен был объявить «тип тег» внутри

type Tagged[T] = {type Tag = T} 

    def acceptOnlyTagged[T: ClassTag](tagged: Tagged[T]): Unit = { 
    println(implicitly[ClassTag[T]]) 
    } 

    class A { 
    type Tag = Int 
    } 

    class B { 
    type Tag = String 
    } 

    acceptOnlyTagged(new A) 
    acceptOnlyTagged(new B) 

Класса A & B ничего не знаю о Tagged не знает, но можно посмотреть как Tagged, потому что они имеют общую структуру

+0

Удивительно! Большое спасибо за ясное и точное объяснение! – jhegedus

+0

Я не могу найти спецификацию scala для структурных типов, но его статья может быть полезна: http://en.wikibooks.org/wiki/Scala/Structural_Typing –

+0

Я искал ее и нашел одну страницу об этом в книге «Скала для нетерпимого». – jhegedus

Смежные вопросы