在 Scala 中为元组编写类型类

编程入门 行业动态 更新时间:2024-10-10 08:22:41
本文介绍了在 Scala 中为元组编写类型类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在寻找抽象来组合类型类并避免样板代码:

I am looking for abstraction to compose typeclasses and avoid boilerplate code:

sealed trait MyTypeClass[T]{ def add(t:T, mystuff:Something) } object MyTypeClass { implicit def tupled[A,B](implicit adder1: MyTypeClass [A],adder2: MyTypeClass [B]): MyTypeClass [(A,B)] = new MyTypeClass [(A, B)] { override def add(t: (A, B), mystuff: Something): Unit = { val (a,b) = t adder1 add a adder2 add b } } }

有无样板的方法吗?也许是无形的?

Is there a boilerplate free approach ? Maybe in shapeless ?

推荐答案

是的,Shapeless 可以在这里帮助您,它的 TypeClass 类型类:

Yep, Shapeless can help you here, with its TypeClass type class:

trait Something sealed trait MyTypeClass[A] { def add(a: A, mystuff: Something) } import shapeless._ implicit object MyTypeClassTypeClass extends ProductTypeClass[MyTypeClass] { def product[H, T <: HList](htc: MyTypeClass[H], ttc: MyTypeClass[T]) = new MyTypeClass[H :: T] { def add(a: H :: T, myStuff: Something): Unit = { htc.add(a.head, myStuff) ttc.add(a.tail, myStuff) } } def emptyProduct = new MyTypeClass[HNil] { def add(a: HNil, mystuff: Something): Unit = () } def project[F, G](instance: => MyTypeClass[G], to: F => G, from: G => F) = new MyTypeClass[F] { def add(a: F, myStuff: Something): Unit = { instance.add(to(a), myStuff) } } } object MyTypeClassHelper extends ProductTypeClassCompanion[MyTypeClass]

然后:

scala> implicit object IntMyTypeClass extends MyTypeClass[Int] { | def add(a: Int, myStuff: Something): Unit = { | println(s"Adding $a") | } | } defined module IntMyTypeClass scala> import MyTypeClassHelper.auto._ import MyTypeClassHelper.auto._ scala> implicitly[MyTypeClass[(Int, Int)]] res0: MyTypeClass[(Int, Int)] = MyTypeClassTypeClass$$anon$3@18e713e0 scala> implicitly[MyTypeClass[(Int, Int, Int)]] res1: MyTypeClass[(Int, Int, Int)] = MyTypeClassTypeClass$$anon$3@53c29556

请参阅我的博文 此处其他讨论.

See my blog post here for some additional discussion.

更多推荐

在 Scala 中为元组编写类型类

本文发布于:2023-11-25 17:55:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1630745.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:中为   类型   组编   Scala

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!