2015-03-26 9 views
8

Quando ho guardato scalaz.effect.IO codice sorgente, ho notato che ha un metodo apply con la seguente firma:Cosa sono Tower [A] e IvoryTower in Scalaz?

sealed trait IO[A] { 
    def apply(rw: Tower[IvoryTower]): Trampoline[(Tower[IvoryTower], A)] 
} 

Tower[A] e IvoryTower sono definite come:

case class Tower[A]() 
sealed trait IvoryTower 

C'è un esempio di Tower :

object IvoryTower extends IvoryTowers 

trait IvoryTowers { 
    val ivoryTower = Tower[IvoryTower]() 
} 

Qual è lo scopo di questo e classi? Perché lo IO.apply accetta un argomento di tipo Tower[IvoryTower]?

+2

Anch'io vorrei che Scalaz fosse documentato. – rightfold

risposta

7

È un in-joke: IvoryTower è una porta di un tipo Haskell chiamato RealWorld. (Mi piacerebbe che avesse un nome più chiaro - questo riesce ad essere al tempo stesso impenetrabile per i nuovi arrivati ​​e non in realtà divertente). Vedi per es. https://wiki.haskell.org/IO_inside.

+0

Perché si chiama IvoryTower? Perché non FunnyBanana o IntrepidTiger? – ZhekaKozlov

+1

Perché una torre d'avorio dovrebbe essere l'opposto del mondo reale. https://www.google.com/search?q=define%3Aivory%20tower – lmm