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