2013-03-23 64 views
1

如果我使用F#解释,我可以定义一个简单的函数是这样的:在类型信息斯卡拉REPL

> // 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:[email protected]> 

显然,这告诉我,功能multipleOfint->int->bool类型。当我在F#解释器中工作时,我发现这非常有用,它可以作为一个工具来缓存我的内存。

但是,我似乎无法在Scala的REPL中找到类似的功能。我可以定义在Scala中的等价功能容易够当然:

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

但是,如果我在我的斯卡拉REPL会话十分钟,不记得函数的类型,输入multipleOf没有给出关于信息类型(实际上,它给出了一个错误)。同样,:type multipleOf告诉我没有用。

回答

1

Yuck!这就是您正在向您提交问题到StackOverflow的问题的解决方案。希望有人会发现它有用,如果我自己在这里回答它。

事实证明,只要您告诉它将函数评估为部分评估函数,Scala就会为函数提供类型信息。换句话说,下面的伎俩:

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

换句话说,在REPL为您提供有关函数的类型信息,只有当你重新评估功能作为自身的一个部分进行评估版本。这似乎显着低于最佳。 ;-)

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

+3

您需要知道的实际情况是'def'定义_methods_,而不是函数。方法是平凡的(通常是自动的)转换为等价的函数,但是在任何情况下,它都是通过“部分应用”的过程来完成的,这是您在编写'myMethodName _'时所要求的。这是否“不是最优”还是没有争议。但'def'定义了在JVM中直接实现的实体(方法)。作为一流实体的功能,唉,需要更加详尽的实施。 – 2013-03-23 05:33:05

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