2015-09-26 14 views
15

Quando si chiede per il tipo di [Int] e [] in Haskell ottengo:Chiedendo tipo di un tipo a Scala vs Haskell

Prelude> :k [Int] 
[Int] :: * 
Prelude> :k [] 
[] :: * -> * 

che ha un senso: il primo è un tipo e il secondo è un tipo più alto di tipo.

Ma quando faccio lo stesso in Scala:

scala> :k -v List[Int] 
scala.collection.immutable.List's kind is F[+A] 
* -(+)-> * 
This is a type constructor: a 1st-order-kinded type. 

scala> :k -v List 
scala.collection.immutable.List's kind is F[+A] 
* -(+)-> * 
This is a type constructor: a 1st-order-kinded type. 

... si dice entrambi sono tipi kinded più elevati. Perché il primo non è classificato come un tipo corretto? Qual è la ragione di questa differenza?

+2

sembra che il primo proprio non lo fa vedere * * la 'int' (si parla anche di 'scala.collection.immutable.List' – Carsten

risposta

6

Sembra che scala vede la parte [Int] in List[Int] perfettamente, ma sceglie di ignorarlo e sempre guardare il "esterno" di tipo deliberatamente.

Se questo non fosse vero, allora type ListOfInt = List[Int] seguito da :k -v ListOfInt produrrebbe * non * -> *, ma non è questo il caso:

scala> :k -v List 
scala.collection.immutable.List's kind is F[+A] 
* -(+)-> * 
This is a type constructor: a 1st-order-kinded type. 

scala> :k -v List[Int] 
scala.collection.immutable.List's kind is F[+A] 
* -(+)-> * 
This is a type constructor: a 1st-order-kinded type. 

scala> type ListOfInt = List[Int] 
defined type alias ListOfInt 

scala> :k -v ListOfInt 
scala.collection.immutable.List's kind is F[+A] 
* -(+)-> * 
This is a type constructor: a 1st-order-kinded type.