【发布时间】:2022-01-01 01:52:36
【问题描述】:
我有一个类型 Foo[+A, +B] 和一个类型 Bar[+B]。我想像这样将扩展方法bar添加到Foo
implicit class FooSyntax[A](foo: Foo[A, Bar[A]]) {
def bar: A = ???
}
所以扩展方法只适用于B是Bar[A]的情况。因此,以下所有内容都应该编译——
trait Fruit
trait Apple extends Fruit
trait Banana extends Fruit
def foo0: Foo[Apple, Bar[Banana]] = ???
def foo1: Foo[Apple, Bar[String]] = ???
def foo2: Foo[Apple, Bar[Apple]] = ???
def foo3: Foo[Apple, List[Apple]] = ???
foo0.bar // Fruit
foo1.bar // Object
foo2.bar // Apple
对于我的用例,我希望能够在没有 FooSyntax 的情况下使用隐式要求来执行此操作,这样该方法始终可用并且易于发现,但是只有在满足类型条件时才可以调用它.这就是我到目前为止所做的——
trait Foo[+A, +B] {
def bar[C <: A](implicit evA: A <:< C, evB: B <:< Bar[C]): C
}
不用说,这是行不通的。
【问题讨论】:
-
我希望该方法始终可用以便更好地发现,但只有在满足条件时才可以调用它。
标签: scala functional-programming type-level-computation