gpt4 book ai didi

scala - 如何在scala中获得通用(多态)lambda?

转载 作者:行者123 更新时间:2023-12-04 02:11:50 26 4
gpt4 key购买 nike

更新(2018 年):我的祈祷在 Dotty(Type Lambdas)中得到了回应,因此以下问答与“Scala 2.x”相关

只是一个来自 Scala 的简单示例:

scala> def f(x: Int) = x
f: (x: Int)Int

scala> (f _)(5)
res0: Int = 5
让我们让它通用:
scala> def f[T](x: T) = x
f: [T](x: T)T

scala> (f _)(5)
<console>:9: error: type mismatch;
found : Int(5)
required: Nothing
(f _)(5)
^
让我们看一下 Scala 中多态方法的 eta 扩展:
scala> f _ 
res2: Nothing => Nothing = <function1>
与 Haskell 的比较:
Prelude> let f x = x

Prelude> f 5
5
Prelude> f "a"
"a"
Prelude> :t f
f :: t -> t
Haskell 确实推断出正确的类型 [T] => [T]这里。
更现实的例子?
scala> identity _
res2: Nothing => Nothing = <function1>
更现实的:
scala> def f[T](l: List[T]) = l.head
f: [T](l: List[T])T

scala> f _
res3: List[Nothing] => Nothing = <function1>
您不能为身份创建别名 - 必须编写自己的函数。像 [T,U](t: T, u: U) => t -> u 这样的事情(make tuple) 不可能用作值。更一般 - 如果你想传递一些依赖泛型类型的 lambda(例如,使用泛型函数,例如:创建列表、元组,以某种方式修改它们) - 你不能这样做。
那么,如何解决这个问题呢?任何解决方法,解决方案或推理?
附言我使用了术语多态 lambda(而不是函数),因为函数只是命名为 lambda

最佳答案

在 JVM/Scala 上只有方法可以是泛型的,而不是值。您可以创建一个实现某些接口(interface)的匿名实例(并为您想要使用的每个类型复制它):

trait ~>[A[_], B[_]] { //exists in scalaz
def apply[T](a: A[T]): B[T]
}

val f = new (List ~> Id) {
def apply[T](a: List[T]) = a.head
}

或使用无形' Poly ,它支持更复杂的类型案例。但是,是的,这是一个限制,需要解决。

关于scala - 如何在scala中获得通用(多态)lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31530528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com