Scala3中多态函数类型的上下文边界?

zujrkrfu  于 2023-08-05  发布在  Scala
关注(0)|答案(1)|浏览(146)

设置:

我对Scala(特别是Scala 3)有些陌生-所以我知道下面的问题可能是愚蠢/天真的。
我知道下面的多态方法类型可以工作。

def zeroMethod[A:Numeric] = Numeric[A].zero

字符串
这里Numeric是泛型类型A上的上下文绑定。
注意scala> zeroMethod[Int]产生val res0: Int = 0。或者在帮助中键入推断:

scala> val a = zeroMethod[Int]
val a: Int = 0


这一点的一个轻微延伸是

def zeroMethodFromVal[A:Numeric](x : A) = Numeric[A].zero


参数x提供的唯一真实的用途是它促进了类型推断。
具体来说

scala> zeroMethodFromVal(5)
val res1: Int = 0


从那里,我想写一个多态函数类型,它反映了多态方法类型的行为。
如何为多态函数类型添加上下文边界?还是因为上下文边界只是传递隐式参数的语法糖,所以不可能?
当我尝试创建一个与zeroMethod等价的函数时,它会给我各种各样的错误。有些偏离了当前的主题。因此,我将省略那个特定的代码片段。然而,似乎应该可以创建一个与zeroMethodFromVal等效的函数,这不会分散我们的注意力。
具体来说,我的(第一次)尝试是:

val zeroFunFromVal : [A:Numeric] => A => A = [A:Numeric] => (x: A) => zeroMethodFromVal[A](x)


此操作失败,并产生语法错误。它不喜欢添加绑定到泛型的上下文。当然,如果我试图完全消除上下文边界,那么我显然会得到一个类型错误,因为zeroMethodFromVal没有接收到它所需要的隐式(即上下文边界没有在泛型上强制执行)。
有没有办法让这个多态函数类型像多态方法类型一样工作?(包括上下文边界?)

h79rfbju

h79rfbju1#

在Scala 3中,在函数声明中定义隐式参数的语法是ImplicitType ?=> ...
在您的情况下,以下方法有效:

val zeroFunFromVal: [A] => A => Numeric[A] ?=> A =
  [A] => (x: A) => (evA: Numeric[A]) ?=> zeroMethodFromVal[A](x)(evA)

val five: Int = 5
zeroFunFromVal.apply(five) // Gives 0

字符串

相关问题