它是可能的咖喱的其他方式在卡拉?
-
20-09-2019 - |
题
让我们假设这个功能:
def autoClosing(f: {def close();})(t: =>Unit) = {
t
f.close()
}
和这片段:
val a = autoClosing(new X)(_)
a {
println("before close")
}
它是可能的咖喱第一部分?是这样的:
val a = autoClosing(_) { println("before close") }
因此,我可以发送对象在这附近应该执行,并具有相同的框执行上他们吗?
解决方案
是的,只要您给出占位符字符的类型,您给出的代码片段就可以工作。
因此,您正在寻找的代码是:
val a = autoClosing(_: {def close();}) { println("before close") }
其编译并按预期工作:)。
一些注意事项:
- 如果你为一个类型定义一个类型别名,你的生活会更轻松。
AnyRef
类型有一个close
方法,比如type Closeable = AnyRef {def close()}
, ,或适当的接口。 - 代码片段
autoClosing(_: Closeable){ ... }
实际上等价于下面扩展的匿名函数:c: Closeable => autoClosing(c){ ... }
. 。通配符只是部分应用函数的简写。您需要给出的类型_
不幸的是,类型推断器在这种情况下无法推断出类型。
希望能帮助到你,
——弗拉维·西普西甘
其他提示
可替换地可以翻转的参数:
def flip[A1, A2, B](f: A1 => A2 => B): A2 => A1 => B = x1 => x2 => f(x2)(x1)
在你的情况:
val a = flip(autoClosing){ println("before close") }
编辑: 我已经添加了一些括号来帮助人类解析器:
def flip[A1, A2, B](f: (A1 => (A2 => B))): (A2 => (A1 => B)) = {
x1 => (x2 => f(x2)(x1))
}
翻转转换函数(A1 => (A2 => B))
到(A2 => (A1 => B))
。
scala> def x(x1 : Int)(x2 : Long) = 1.0 * x1 / x2
x: (Int)(Long)Double
scala> val f = flip(x)
f: (Long) => (Int) => Double = <function>
scala> val g = f(1)
g: (Int) => Double = <function>
scala> val h = g(2)
h: Double = 2.0
scala> x(1)(2)
res0: Double = 0.5
不隶属于 StackOverflow