scala – 将双子座提升为一个函子
也许我错过了一些明显的东西,但是我正在使用Scalaz 7的项目来清理一些样板,而且我没有找到一个似乎很简单和可能有用的特定的拼图。
假设我们有两种类型的双射: case class Foo(x: Int) case class Bar(i: Int) import scalaz._,Scalaz._,BijectionT._ val fb: Foo <@> Bar = bijection[Id,Id,Foo,Bar]( foo => Bar(foo.x),bar => Foo(bar.i) ) 现在假设我们发现我们需要List [Foo]和List [Bar]之间的双向。我们可以轻松地编写一个提供此功能的隐式类(实际上我们也可以使其适用于任何函子): implicit class BijectionLifter[A,B](val bij: A <@> B) extends AnyVal { def liftInto[F[_]: Functor]: F[A] <@> F[B] = bijection[Id,F[A],F[B]]( _ map bij.to,_ map bij.from ) } 请注意,这是Haskell的 现在我们可以写下列内容: fb.liftInto[List] 我们已经有了我们需要的双赢。 我错过了一些抽象,这将使我有可能更清晰地写出在Scalaz 7中已经提供的双重对象的功能和实例? 解决方法
引用
Lars Hupel从Twitter
in response to this question:
和:
所以答案显然不是,我没有丢失任何东西,这实际上是当前API中的差距,可能会在将来的Scalaz版本中被修复。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |