Scala REPL:如何查找函数类型?

11

在Scala REPL中,可以查找值类型:

    scala> val x = 1
    x: Int = 1

    scala> :t x
    Int

然而,Scala REPL 对于函数类型的信息不予显示:

    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
          ^

如何在Scala REPL中查找函数类型?

错误信息中所说的怎么样? - George
可能是这个的重复问题。 - pagoda_5b
2个回答

27

遵循以下建议会有很好的效果:



:t inc _
Int => Int

为了提供更多细节,这是必需的原因是Scala在'方法'和'函数'之间保持区分。'方法'在JVM中具有本地支持,但不是第一类,而'函数'被视为FunctionX实例,并被JVM看作对象。使用下划线将前者转换为后者。

1
谢谢!那我为什么不能执行 :t scala.collection.immutable.List.type.foldLeft _,也不能执行 :t java.Lang.String.split _ - Anton Ashanin
2
这些都是类方法,你只能部分应用(即转换为“Function”对象)实例方法。创建一个特定的List实例,然后就可以检查其foldLeft方法的类型。 - Impredicative

4
你可以输入方法名称,然后按Tab键。
Stream.fill<tab>

为您提供:

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接