有时我偶然发现了一个半神秘的符号
def f[T](..) = new T[({type l[A]=SomeType[A,..]})#l] {..}
在 Scala 博客文章中,它给了它一个“我们使用了那种类型 lambda 技巧”的手波。
虽然我对此有一些直觉(我们获得了一个匿名类型参数
A
而不必用它污染定义?),我发现没有明确的来源描述什么是类型 lambda 技巧,以及它有什么好处。它只是语法糖,还是打开了一些新的维度?
最佳答案
好处与匿名函数所赋予的好处完全相同。
def inc(a: Int) = a + 1; List(1, 2, 3).map(inc)
List(1, 2, 3).map(a => a + 1)
使用 Scalaz 7 的示例。我们想使用
Functor
可以将函数映射到 Tuple2
中的第二个元素.type IntTuple[+A]=(Int, A)
Functor[IntTuple].map((1, 2))(a => a + 1)) // (1, 3)
Functor[({type l[a] = (Int, a)})#l].map((1, 2))(a => a + 1)) // (1, 3)
Scalaz 提供了一些隐式转换,可以将类型参数推断为
Functor
,所以我们经常完全避免写这些。上一行可以改写为:(1, 2).map(a => a + 1) // (1, 3)
如果您使用 IntelliJ,您可以启用 Settings、Code Style、Scala、Folding、Type Lambdas。这然后hides the crufty parts of the syntax ,并呈现更可口的:
Functor[[a]=(Int, a)].map((1, 2))(a => a + 1)) // (1, 3)
Scala 的 future 版本可能会直接支持这种语法。
关于scala - 什么是 Scala 中的类型 lambda,它们有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12939937/