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"))) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- angularjs – Angular.js:$ eval如何工作,为什么它不同于v
- reporting services 2008的报表使用Resource File中的多语言
- 图解DotNet框架之十:WCF(Remoting,Webservice)
- angularjs之ui-bootstrap的Datepicker Popup不使用JS实现双
- angular – Ionic Live Reload – 需要很长时间而且不能保存
- 发声 | 向《AngularJS 2权威指南》作者Nate Murray提问!
- 以角度5显示/隐藏链接的最佳方式
- 如何转换已在函数中定义的Scala值
- 在Angular.io中配置HTTP的端口
- Angular的NO_ERRORS_SCHEMA存在问题?