【问题标题】:Cats typeclass for isomorphic types同构类型的 Cats 类型类
【发布时间】:2018-10-31 03:55:23
【问题描述】:

我应该使用什么猫类型类来编码两种类型是同构的(即可以在没有影响的情况下来回转换)

我想将一个类型的分解编码为另外两个的元组: A <=> (B, C)

显然,typeclass 应该为每个转换方向公开两个函数,并为方便转换提供理想的隐式方法。 像这样的东西:(但没找到)

trait Iso[A,B] {
  def to(a: A):B
  def from(b: B): A
}

【问题讨论】:

  • 根据this blog entry“Cats 似乎没有表示同构的数据类型”

标签: scala scala-cats


【解决方案1】:

你在找cats.evidence.Is吗?

type A
type B

type X = Is[A, B] // A Is B

val a: A = ???
val b: B = ???
val x: A Is B = ???
val y: B Is A = ???

x.coerce(a): B
y.coerce(b): A

类似于scalaz.Leibniz

【讨论】:

  • 其实Is 与同构有很大不同。 Is需要你定义substitute:F[A] => F[B],这比A <=> B更难。我仍然想知道猫是否具有同构性? (比如我可以定义Duration <=> Double,但是不知道怎么定义Is[Duration, Double]
  • @ISeeVoices 好吧,它定义了一个同构。 x.coerce(_) 是直接映射,y.coerce(_) 是逆映射。当然不是每个同构都可以这样定义。
猜你喜欢
  • 2018-06-03
  • 1970-01-01
  • 2018-07-20
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多