分离方法

时间:2012-11-19 16:27:47

标签: scala

是否可以从类中分离方法?

class A {
  def b(C): D
}

是否有一个函数需要b并返回一个函数 签名A => C => D(A,C) => D

3 个答案:

答案 0 :(得分:2)

通常没有必要从具有单个参数的方法显式创建新的二进制函数,因为当编译器需要这样的函数类型时,您可以使用_ methodName _中缀运算符语法来表示匿名函数。 / p>

第一个_取代目标对象(A的实例),第二个_取代该方法的参数。

例如,如果您有潜在的使用网站

def swizzle(f: (A, C) => D) = sys.error("todo")

然后你可以像这样引用方法b

swizzle(_ b _)

答案 1 :(得分:1)

我不知道有关这样做的功能,但很容易创建这样的功能:

val f: A => C => D = a => c => a b c

答案 2 :(得分:0)

这个概念被称为 eta扩展。以下是Scala语言规范的相关部分:


6.26.2方法转换

以下四种隐式转换可以应用于不是的方法 适用于某些参数列表。

  • <强>评价即可。类型m的无参数方法=> T始终转换为类型 T通过评估m绑定的表达式。

  • 隐式应用。如果该方法仅采用隐式参数,则遵循§7.2。

  • 的规则传递隐式参数
  • Eta扩展。否则,如果方法不是构造函数,那么就是预期的 type pt是一个函数类型(Ts ) ⇒ T,对eta-expansion(§6.26.5)执行 表达e

  • 清空申请。否则,如果e具有方法类型()T,则会隐式应用它 空参数列表,产生e()