当前位置: 首页 > 知识库问答 >
问题:

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

郎欣然
2023-03-14

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

有没有一种方法可以做到这一点,而不定义一个全新的(类似的)类型类?

共有1个答案

孔运良
2023-03-14

有一个额外的显式参数吗?否。每个typeclass实例必须具有相同的接口,即typeclass的接口。带有隐式参数?是的。您可以声明一个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馈送任何catPersonFeeder是一个DEF,它可以创建一个隐式来向Person,但需要一个隐式的Silverware。因此在类似于:

feedAnimal(Person("John"))

编译器将搜索隐式AnimalFeeder[Person],将搜索PersonFeeder,然后将搜索隐式Silverware,最后找到GoodSilver

 类似资料:
  • 问题内容: 给定Date有一个名为“ after(Date)”的方法,而Timestamp有一个名为“ after(Timestamp)”的方法,为什么在以下代码中调用Date中的 after 方法? 至于意外结果有人问在这里。 结果 问题答案: 重载是在编译时考虑的;覆盖在执行时考虑。 时间戳 重载 ,它不会 覆盖 现有方法- 因此您只考虑了中的方法; 而且即使你使用它会 仍然 只使用因为编译时

  • 我想使用泛型类作为另一个泛型类的类型参数。 起初,我对类的定义是这样的: 然后我的需求发生了变化,我不得不为我的R类型使用包装器/持有者类 到目前为止,我的尝试:(给出编译时错误:

  • 我有2种类型的类型类,其中一种类型包含另一种类型 我想这样称呼我的类型类: 但这行不通。 错误:(34,23)找不到参数e的隐式值:com.playground.Valides[com.playground.MyModel1,model.version.type]val v=隐式[Valides[MyModel1,model.version.type]]错误:(34,23)没有足够的隐式方法参数:

  • 当我们创建一个类型类时,通常会假设它的函数必须服从某些属性。因此,我们得到了它们各自类型类的么半群和么单律。但是,如果有某种规律,比如结合性,我想要指定多个类可以服从,也可以不服从这个规律,那该怎么办?在Haskell的类型系统中有办法做到这一点吗?这种类型类对类型类的想法在实践中是否可行? 下面是代数中一个很有启发性的例子:

  • 通过数据类,我们可以方便地得到很多有趣的函数,一部分是来自属性,我们之前已经讲过(从编写getter和setter函数): equals(): 它可以比较两个对象的属性来确保他们是相同的。 hashCode(): 我们可以得到一个hash值,也是从属性中计算出来的。 copy(): 你可以拷贝一个对象,可以根据你的需要去修改里面的属性。我们会在稍后的例子中看到。 一系列可以映射对象到变量中的函数。

  • 问题内容: ./chains.go:26:10:不能在作业中使用UpperCaseHandler(typefunc(asl.MessageDelivery))作为asl.MessageHandler类型./chains.go:37:86:无法使用RepeatHandler(类型func(asl.MessageDelivery))与Repeater.ConsumeFunc的参数中的asl.Messa