2013-03-16 2 views
5

Sto provando a impostare una vista vincolata su un tipo alto tipo e ricevo un messaggio di errore che non riesco a capire.Visualizzazione dei limiti su tipi di tipo superiore

$ scala -language:higherKinds 
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_43). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> trait F[M[_]] 
defined trait F 

scala> def foo[M[_]](implicit m: M[_] => F[M]) = 42 
foo: [M[_]](implicit m: M[_] => F[M])Int 

scala> def bar[M[_] <% F[M]] = 42 
<console>:8: error: type M takes type parameters 
     def bar[M[_] <% F[M]] = 42 
        ^

Non dovrebbe bar compilare nella stessa cosa di foo? Cosa mi manca?

risposta

6

Nota che c'è una sottile distinzione tra il M[_] nella lista dei parametri tipo e il tipo M[_] (vale a dire, il ruolo delle M[_] gioca nel tipo di funzione nella lista dei parametri implicito). Il primo è un del tipo costruttore e il secondo è un tipo esistente (vedere le sezioni 4.4 e 3.2.10 dello Scala language specification per ulteriori informazioni).

Così, per esempio, abbiamo potrebbe sostituire il tipo di parametro del costruttore M[_] con M[X] senza cambiare il significato, ma questo sarebbe un errore di sintassi in quest'ultimo caso (che è una scorciatoia, invece di qualcosa di simile M[X] forSome { type X }).

La differenza può essere più chiaro nel seguente esempio (che compila bene):

scala> def bar[M[_], M_ <: M[_] <% F[M]] = 42 
bar: [M[_], M_ <: M[_]](implicit evidence$1: M_ => F[M])Int 

Qui il primo M[_] è un parametro di tipo di costruzione, e la seconda (il limite superiore M_) è un esistenziale genere.

Il compilatore di Scala potrebbe fare in modo che M[_] <% F[M] funzioni come ci si aspetta da qui, cioè potrebbe convertire il parametro di costruzione del tipo in un tipo esistenziale nel tipo del parametro implicito che esso crea per il contesto, ma che sarebbe richiedono un piccolo extra di magia per il compilatore, e ce ne sono già abbastanza per andare in giro.

+0

Grazie per la spiegazione. Comunque, mi sembra un po 'incoerente. – aztek