val函数中多态性的Scala语法

val函数中多态性的Scala语法,scala,generics,syntax,functional-programming,polymorphism,Scala,Generics,Syntax,Functional Programming,Polymorphism,这可能非常简单,但我找不到任何关于我的问题的文档。 在Scala中定义函数有两种方法,一种是使用def,另一种是使用val关键字。作为函数式编程的高手,我更愿意使用后者 现在我有一个问题:使用多态类型参数编写def函数没有问题: def函数[T]n:T={printn}//语法良好 然而,如何使用val关键字做同样的事情仍然让我迷惑不解。这种幼稚的方法在语法上是无效的: val函数[T]:a:T=>printa//不编译 也就是说,我很可能误解了Scala在多态性和泛型方面的方法。这将需要更高级

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

现在我有一个问题:使用多态类型参数编写def函数没有问题:

def函数[T]n:T={printn}//语法良好 然而,如何使用val关键字做同样的事情仍然让我迷惑不解。这种幼稚的方法在语法上是无效的:

val函数[T]:a:T=>printa//不编译
也就是说,我很可能误解了Scala在多态性和泛型方面的方法。

这将需要更高级别的类型,Scala 2中不支持这种类型

Scala 3支持它:

这需要更高级别的类型,Scala 2中不支持这种类型

Scala 3支持它:

在Scala 2中,不可能定义参数函数,而只能定义方法

在Scala 3中引入了:

val fun: [A] => A => Unit = [A] => a => println(a.toString)
猫和朋友在2中使用的变通方法是具有多态性的特征

不幸的是,单一抽象方法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))
后者我看到了几种不同的形式:上面一种使用存在类型,另一种使用上面一种用于方法签名,宏用于实现,请参见

不过,通常情况下,您可以使用返回非参数函数的参数化空值方法

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

在Scala 2中,不可能定义参数函数,而只能定义方法

在Scala 3中引入了:

val fun: [A] => A => Unit = [A] => a => println(a.toString)
猫和朋友在2中使用的变通方法是具有多态性的特征

不幸的是,单一抽象方法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))
后者我看到了几种不同的形式:上面一种使用存在类型,另一种使用上面一种用于方法签名,宏用于实现,请参见

不过,通常情况下,您可以使用返回非参数函数的参数化空值方法

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

实际上,第一条语句是错误的,def创建的是方法,而不是函数。实际上,你所要做的是寻找函数和方法之间的区别;博士您想要的在Scala 2中是不可能的,但在Scala 3中是可能的。实际上,第一条语句是错误的,def创建的是方法,而不是函数。实际上,你所要做的是寻找函数和方法之间的区别;博士您想要的东西在Scala 2中是不可能的,但在Scala 3中是可能的。