4

开始学习 Scala,我想在控制台中快速查看方法签名。例如,在 Haskell 中,我会这样做:

Prelude> :t map
map :: (a -> b) -> [a] -> [b]

这清楚地显示了 map 函数的签名,即它需要:

  1. 接受a并返回b的函数
  2. 一个列表

并返回

  1. b列表

由此得出结论,map 函数通过将函数应用于列表的每个元素,将a的列表转换为b的列表。

有没有办法在 Scala 中以类似的方式获取方法类型?

更新:

尝试 Federico Dal Maso 的答案,并得到这个

scala> :type Array.fill
<console>:8: error: ambiguous reference to overloaded definition,
both method fill in object Array of type [T](n1: Int, n2: Int, n3: Int, n4: Int, n5: Int)(elem: => T)(implicit evidence$13: scala.reflect.ClassManifest[T])Array[Array[Array[Array[Array[T]]]]]
and  method fill in object Array of type [T](n1: Int, n2: Int, n3: Int, n4: Int)(elem: => T)(implicit evidence$12: scala.reflect.ClassManifest[T])Array[Array[Array[Array[T]]]]
match expected type ?
       Array.fill

显然 fill 方法被重载了, :type 无法决定显示哪个重载。那么有没有办法显示所有方法重载的类型呢?

4

3 回答 3

4
scala> :type <expr>  

显示表达式的类型而不计算它

于 2012-09-27T08:14:26.600 回答
2

Scalas REPL 只能显示有效表达式的类型,在这里它没有 ghci 强大。相反,您可以使用scalex.org(等效于 Scalas Hoogle)。输入array fill并接收:

Array fill[T]: (n: Int)(elem: ⇒ T)(implicit arg0: ClassManifest[T]): Array[T]
于 2012-09-27T14:18:20.343 回答
0

:type <expr>

有效,但如果expr是一种方法,那么您需要添加下划线以将其视为部分应用的功能。

scala> def x(op: Int => Double): List[Double] = ???
x: (op: Int => Double)List[Double]

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

scala> :type x _
(Int => Double) => List[Double]
于 2017-02-08T08:36:16.360 回答