Aar*_*kon 1 generics syntax polymorphism functional-programming scala
这可能非常简单,但我找不到关于我的问题的任何文档。
在 Scala 中有两种定义函数的方法,一种def是使用 theval关键字,另一种是使用关键字。作为函数式编程的高手,我更喜欢使用后者。
现在我有一个问题:写一个def带有多态类型参数的函数是没有问题的:
def function[T](n: T) = {print(n)} // syntactically fine
Run Code Online (Sandbox Code Playgroud)
但是,如何使用val关键字做同样的事情仍然让我感到困惑。这种天真的方法在语法上是无效的:
val function[T]: (a: T) => print(a) // Doesn't compile
Run Code Online (Sandbox Code Playgroud)
也就是说,我绝对有可能在这里误解了 Scala 在多态性和泛型方面的方法。
在 Scala 2 中,无法定义参数函数,只能定义方法。
在 Scala 3中引入了多态函数类型:
val fun: [A] => A => Unit = [A] => a => println(a.toString)
Run Code Online (Sandbox Code Playgroud)
猫和朋友在 2 中使用的解决方法是具有多态的特征 apply
trait MySpecialFunctionlikeThing {
def apply[A](a: A): Unit
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,单一抽象方法 (SAM) 不适用于这样的事情,因此使用了一些技巧来轻松将功能提升到此类方法中:
object MySpecialFunctionlikeThing {
type Arbitrary
def lift(f: Arbitrary => Unit): MySpecialFunctionlikeThing =
new MySpecialFunctionlikeThing {
def apply[A](a: A): Unit = f(a.asInstanceOf[Arbitrary])
}
}
val fun = MySpecialFunctionlikeThing.lift(a => println(a))
Run Code Online (Sandbox Code Playgroud)
后者我看到了几种不同的形式:上面的,一种使用存在类型,另一种使用上面的一种用于方法签名和宏用于实现(请参阅 参考资料FunctionK.lift)。
但是,很多时候,您可以摆脱所使用的参数,即返回非参数函数的空方法。
def fun[A]: A => Unit = a => println(a)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |