【问题标题】:Type information in the Scala REPLScala REPL 中的类型信息
【发布时间】:2013-03-23 23:37:21
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: scala f#


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 您需要知道的实际事实是def 定义了方法,而不是函数。方法被简单地(并且通常是自动地)转换为等效函数,但在每种情况下,它都是通过“部分应用程序”的过程来实现的,这是您在编写myMethodName _ 时所要求的。这是否“不是最理想的”是有争议的。但是def 定义了在 JVM 中直接实现的实体(方法)。唉,作为一等实体的函数需要更精细的实现。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2011-12-01
      • 2013-03-14
      • 1970-01-01
      相关资源
      最近更新 更多