加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala – Typeclass的例子 如何解释好处?

发布时间:2020-12-16 09:37:28 所属栏目:安全 来源:网络整理
导读:所以我在同事/朋友中展示了Scala中类型类型的一个例子。看起来像这样: case class Song(name: String,artist: String)case class Address(street: String,number: Int)trait LabelMaker[T] { def output(t: T): String}object LabelMaker { implicit object
所以我在同事/朋友中展示了Scala中类型类型的一个例子。看起来像这样:

case class Song(name: String,artist: String)
case class Address(street: String,number: Int)

trait LabelMaker[T] {
  def output(t: T): String
}

object LabelMaker {
  implicit object addressLabelMaker extends LabelMaker[Address] {
    def output(address: Address) = {
      address.number + " " + address.street + " street"
    }
  }
  implicit object songLabelMaker extends LabelMaker[Song] {
    def output(song: Song) = {
      song.artist + " - " + song.name
    }
  }
  def label[T : LabelMaker](t: T) = implicitly[LabelMaker[T]].output(t)
}

可以这样使用:

import LabelMaker._
println(label(new Song("Hey Ya","Outkast"))) // Outkast - Hey Ya
println(label(new Address("Smithsonian",273))) // 273 Smithsonian street

这不是最好的例子,回想起来,希望能拿出更好的例子。在显示他的时候,他回答了一个反例,并问了类型模式实际带来的好处:

case class Song(name: String,number: Int)

object LabelMaker {

    def label(address: Address) = {
        address.number + " " + address.street + " street"
    }

    def label(song: Song) = {
        song.artist + " - " + song.name
    }
}

import LabelMaker._
println(label(new Song("Hey Ya",273))) // 273 Smithsonian street

我努力回答正确,这让我意识到我不太明白100%的收益。我理解他们的实现和非常本地化的好处,当别人使用它们,但实际上简洁的解释它们是相当困难的。有人可以帮我吗也许延伸我的例子,真正显示好处。

解决方法

类型类捕获了 retroactive extensibility的概念。使用静态方法重载,您必须在一个位置一次定义它们,但是在类型类中,您可以随时在任何模块中为任何新类型定义新实例。
例如

object LabelMaker {
  // ... your original cases here ...
  def label[T : LabelMaker](t: T) = implicitly[LabelMaker[T]].output(t)
}

// somewhere in future
object SomeModule {
  import LabelMaker._

  case class Car(title: String)

  implicit object carLabelMaker extends LabelMaker[Car] {
    def output(car: Car) = car.title
  }  
}

object Main extends App {
  import LabelMaker._
  import SomeModule._

  println(label(Car("Mustang")))
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读