在Scala REPL中键入信息

时间:2013-03-23 04:59:42

标签: scala f#

如果我正在使用F#解释器,我可以定义一个这样的简单函数:

> // Function to check if x is an integer multiple of y
> let multipleOf x y = (x % y = 0);;

val multipleOf : x:int -> y:int -> bool

如果我知道F#解释器会话中存在一个函数,但我不确定它的精确类型,我可以让解释器只需键入函数名称就可以给我类型:

> // I can't remember the type of the function multipleOf!
> multipleOf;;

val it : (int -> int -> bool) = <fun:it@12-1>

显然,这告诉我函数multipleOf的类型为int->int->bool。我觉得这个工具非常有用,可以在F#解释器中工作时慢慢记忆。

但是,我似乎无法在Scala的REPL中找到类似的功能。我当然可以很容易地在Scala中定义一个等效函数:

def multipleOf(x: Int, y: Int) = x % y == 0

但是如果我在Scala REPL会话中已经十分钟并且无法记住该函数的类型,则键入multipleOf不会提供有关该类型的信息(事实上,它会给出错误)。同样,:type multipleOf告诉我一切没用。

2 个答案:

答案 0 :(得分:3)

scala> val f = (i: Int, j: Int) => i % j == 0
f: (Int, Int) => Boolean = <function2>

scala> f
res2: (Int, Int) => Boolean = <function2>

scala> def multipleOf(x: Int, y: Int) = x % y == 0
multipleOf: (x: Int, y: Int)Boolean

scala> :type multipleOf(_, _)
(Int, Int) => Boolean

答案 1 :(得分:1)

呸!这就是在你将要向StackOverflow提交问题时,问题解决方案出现的情况之一。如果我自己在这里回答,希望有人会发现它很有用。

事实证明,只要你告诉它将函数评估为部分评估函数,Scala就会为函数提供类型信息。换句话说,以下是诀窍:

scala> multipleOf _
res0: (Int, Int) => Boolean = <function2>

换句话说,只有当您将函数重新评估为自身的部分评估版本时,REPL才会为您提供有关函数类型的信息。这似乎远远不是最佳的。 ; - )

也许有人可以在评论中提到为什么Scala以这种方式处理事情是理智的?