gpt4 book ai didi

需要两个隐式参数之一的 Scala 方法

转载 作者:行者123 更新时间:2023-12-03 18:25:05 24 4
gpt4 key购买 nike

如果我可以创建具有类似想法的方法,我很感兴趣:

def myMethod[T](param: T)(implicit oneOf: Either[TypeClass1[T], TypeClass2[T]]) = oneOf match ...

我尝试使用默认参数(我在 akka 中看到过类似的东西):
def myMethod[T](param: T)(implicit t1: TypeClass1[T] = null, t2: TypeClass2[T] = null) = 
if (t1 == null) ...

但是,这样我就不能强制 Scala 编译器至少找到其中之一。

另外,我已经实现了来自 TypeClass1[T] 的隐式转换至 Left[TypeClass1[T], TypeClass2[T]]来自 TC2Right ,但是 Scala 编译器会忽略这种转换。

有没有办法做这样的事情?

最佳答案

显而易见的解决方案是创建一个可以使用 TypeClass1 构造的新类型类。或 TypeClass2 .新类型类实现了 myMethod 使用的功能这对两者都是通用的,并将其映射到 TypeClass1 上的适当方法或 TypeClass2 .

下面是一个例子:

  trait TypeClass1[T] {
def showOne = println("Typeclass 1")
}

trait TypeClass2[T] {
def showTwo = println("Typeclass 2")
}

trait UnionTypeClass[T] {
def show
}

object UnionTypeClass {
implicit def t1[T](implicit ev: TypeClass1[T]) = new UnionTypeClass[T] {
def show = ev.showOne
}

implicit def t2[T](implicit ev: TypeClass2[T]) = new UnionTypeClass[T] {
def show = ev.showTwo
}
}


implicit object IntClass extends TypeClass1[Int]
implicit object StringClass extends TypeClass2[String]


def myMethod[T](param: T)(implicit ev: UnionTypeClass[T]) = {
ev.show
}

myMethod(0)
myMethod("hello")

这将打印
Typeclass 1
Typeclass 2

关于需要两个隐式参数之一的 Scala 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61060507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com