2013-03-25 15 views
8

In Scala REPL si possono trovare i tipi di valore:Scala REPL: come trovare il tipo di funzione?

scala> val x = 1 
    x: Int = 1 

    scala> :t x 
    Int 

Eppure Scala REPL non mostra le informazioni sul tipo per le funzioni:

scala> def inc(x:Int) = x + 1 
    inc: (x: Int)Int 

scala> :t inc 
<console>:9: error: missing arguments for method inc; 
follow this method with `_' if you want to treat it as a partially applied function 
     inc 
    ^
<console>:9: error: missing arguments for method inc; 
follow this method with `_' if you want to treat it as a partially applied function 
      inc 
     ^

Come trovare tipo di funzione a Scala REPL?

+0

ne dite di fare quello che dice nel messaggio di errore? – folone

+0

possibile duplicato di [this] (http://stackoverflow.com/questions/15583551/type-information-in-the-scala-repl) –

risposta

21

Seguendo il suggerimento funziona abbastanza bene:

:t inc _ 
Int => Int 

Per dare un po 'più in dettaglio, la ragione per cui questo è necessario è che Scala mantiene una distinzione tra 'metodi', che hanno il supporto nativo nella JVM, ma che non sono di prima classe e 'funzioni', che sono trattati come istanze di FunctionX e visti come oggetti dalla JVM. L'uso della sottolineatura finale converte il primo in quest'ultimo.

+1

Grazie! Perché allora non posso fare: ': t scala.collection.immutable.List.type.foldLeft _' e anche io non posso fare': t java.Lang.String.split _'? –

+2

Questi sono entrambi metodi di classe e si può applicare solo parzialmente (ovvero convertire in un oggetto 'Function') un metodo di istanza. Crea una particolare istanza di un 'Elenco', per esempio, e sarai in grado di ispezionare il tipo del suo metodo' foldLeft'. – Impredicative

0

È possibile scrivere il nome del metodo e premere la scheda.

Stream.fill<tab> 

ti dà:

def fill[A](n1: Int,n2: Int,n3: Int)(elem: => A): 
scala.collection.immutable.Stream[scala.collection.immutable.Stream[scala.collection.immutable.Stream[A]]] 
def fill[A](n1: Int,n2: Int,n3: Int,n4: Int)(elem: => A): scala.collection.immutable.Stream[scala.collection.immutable.Stream[scala.collection.immutable.Stream[scala.collection.immutable.Stream[A]]]] 
def fill[A](n1: Int,n2: Int)(elem: => A): scala.collection.immutable.Stream[scala.collection.immutable.Stream[A]] 
def fill[A](n1: Int,n2: Int,n3: Int,n4: Int,n5: Int)(elem: => A): scala.collection.immutable.Stream[scala.collection.immutable.Stream[scala.collection.immutable.Stream[scala.collection.immutable.Stream[scala.collection.immutable.Stream[A]]]]] 
override def fill[A](n: Int)(elem: => A): scala.collection.immutable.Stream[A] 
Problemi correlati