gpt4 book ai didi

scala - 在类型类中,如何使用额外的参数来改变操作?

转载 作者:行者123 更新时间:2023-12-01 03:48:31 24 4
gpt4 key购买 nike

在 Scala 类型类中,将有一个定义操作的特征,例如NumberLikeplus()minus() , Transformertransform() , 或 AddressLabelMakertoLabel() .然后可以使用类型类成员扩展特征。

通常,对于不同的成员,操作将具有相同数量的参数,即签名看起来非常相似。我的问题是:如果成员需要本质上相同的操作,但带有一个额外的参数(可能只是一个隐含的参数:根据上下文修改操作的东西),会发生什么?

有没有办法在不定义全新(相似)类型类的情况下做到这一点?

最佳答案

有一个额外的显式参数?不可以。每个 typeclass 实例必须具有与 typeclass 相同的接口(interface)。带有隐式参数?是的。您可以声明 implicit def返回所需的隐式但本身需要一个隐式。下面是一个例子来解释:

case class Cat(name: String)
case class Person(name: String)
case class Silverware(kind: String)

implicit object GoodSilver extends Silverware("the good silver")

trait AnimalFeeder[A] {
def feed(animal: A): Unit
}

implicit object CatFeeder extends AnimalFeeder[Cat] {
def feed(cat: Cat) = println(cat.name + " eats cat food!")
}

implicit def personFeeder(implicit silverware: Silverware) =
new AnimalFeeder[Person] {
def feed(person: Person) =
println(person.name + " eats people food with " + silverware.kind)
}

def feedAnimal[A](a: A)(implicit feeder: AnimalFeeder[A]) = feeder.feed(a)
CatFeeder提供一个暗示猫喂任何 Cat . personFeederdef可以创建一个隐式来提供 Person ,但需要隐式 Silverware .所以在这样的调用中:
feedAnimal(Person("John"))

编译器将搜索隐式 AnimalFeeder[Person] , 会找到 personFeeder ,然后将搜索隐式 Silverware , 终于找到 GoodSilver .

需要注意的是 personFeeder不是 隐式转换。尽管是来自 Silverware 的方法至 AnimalFeeder[Person]它永远不会隐式转换 Silverware .这是因为它的参数标记为 implicit ,隐式转换的参数必须是显式的。

关于scala - 在类型类中,如何使用额外的参数来改变操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24920658/

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