1

如果我使用 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是 type int->int->bool。在 F# 解释器中工作时,我发现这非常有用,可以作为记忆记忆的工具。

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

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

但是,如果我在 Scala REPL 会话中进行了十分钟并且不记得函数的类型,则键入multipleOf不会提供有关类型的信息(实际上,它会给出错误)。同样,:type multipleOf告诉我没有任何用处。

4

2 回答 2

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
于 2013-03-23T15:26:29.813 回答
1

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

事实证明,只要您告诉 Scala 将函数评估为部分评估的函数,Scala 就会在为函数提供类型信息方面发挥作用!换句话说,以下方法可以解决问题:

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

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

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

于 2013-03-23T04:59:41.580 回答