如果我正在使用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
告诉我一切没用。
答案 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以这种方式处理事情是理智的?