开始学习Scala,我想在控制台中快速查看方法签名。 例如,在Haskell中,我会这样做:
Prelude> :t map
map :: (a -> b) -> [a] -> [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无法决定显示哪个重载。那么有没有办法显示所有方法重载的类型?
答案 0 :(得分:4)
scala> :type <expr>
显示表达式的类型而不进行评估
答案 1 :(得分:2)
Scalas REPL只能显示有效表达式的类型,它不像ghci那样强大。相反,您可以使用scalex.org(Scalas Hoogle等效版)。输入array fill
并接收:
Array fill[T]: (n: Int)(elem: ⇒ T)(implicit arg0: ClassManifest[T]): Array[T]
答案 2 :(得分: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]