val函数中多态的Scala语法

这可能非常简单,但我找不到关于我的问题的任何文档。
在 Scala 中有两种定义函数的方法,一种def是使用 theval关键字,另一种是使用关键字。作为函数式编程的高手,我更喜欢使用后者。

现在我有一个问题:写一个def带有多态类型参数的函数是没有问题的:

def function[T](n: T) = {print(n)} // syntactically fine

但是,如何使用val关键字做同样的事情仍然让我感到困惑。这种天真的方法在语法上是无效的:

val function[T]: (a: T) => print(a) // Doesn't compile

也就是说,我绝对有可能在这里误解了 Scala 在多态性和泛型方面的方法。

回答

在 Scala 2 中,无法定义参数函数,只能定义方法。

在 Scala 3中引入了多态函数类型:

val fun: [A] => A => Unit = [A] => a => println(a.toString)

猫和朋友在 2 中使用的解决方法是具有多态的特征 apply

trait MySpecialFunctionlikeThing {
  def apply[A](a: A): Unit
}

不幸的是,单一抽象方法 (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))

后者我看到了几种不同的形式:上面的,一种使用存在类型,另一种使用上面的一种用于方法签名和宏用于实现(请参阅 参考资料FunctionK.lift)。

但是,很多时候,您可以摆脱所使用的参数,即返回非参数函数的空方法。

def fun[A]: A => Unit = a => println(a)


以上是val函数中多态的Scala语法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>