scala - 什么是 Scala 中的类型 lambda,它们有什么好处?

标签 scala types

有时我偶然发现了一个半神秘的符号

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/

相关文章:

scala - 在子项目中打开 sbt

java - 缺少依赖项 'class javax.jdo.spi.PersistenceCapable$ObjectIdFieldSupplier' ,model.jar(model/error/Error.class) 需要

android - Scala 对象是否在 Android 上的 Activity 重启后仍然存在?

PowerShell 无法在 try/catch block 中找到异常类型

将 mime 类型映射到友好的人性化文件类型的 Java 库或文本文件

python - 为什么使用 isinstance() 而不是 type()?

java - 在执行 Maven 构建或打包时从最终 jar 中删除记录器行

scala - Scalaz 中的 Tower[A] 和 IvoryTower 是什么?

java - 为什么自动装箱在数组中不起作用?

c - 预期为 ‘struct matrix_t *’,但参数的类型为 ‘struct matrix_t *’ ?_?没有不同