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

scala – 将双子座提升为一个函子

发布时间:2020-12-16 09:42:07 所属栏目:安全 来源:网络整理
导读:也许我错过了一些明显的东西,但是我正在使用Scalaz 7的项目来清理一些样板,而且我没有找到一个似乎很简单和可能有用的特定的拼图。 假设我们有两种类型的双射: case class Foo(x: Int)case class Bar(i: Int)import scalaz._,Scalaz._,BijectionT._val fb
也许我错过了一些明显的东西,但是我正在使用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的Data.Bijection的bimap的简单翻译.Scalaz的双射还有一个名为bimap的方法,但它有一种繁忙的类型,似乎没有以任何明显的方式做我想要的。

现在我们可以写下列内容:

fb.liftInto[List]

我们已经有了我们需要的双赢。

我错过了一些抽象,这将使我有可能更清晰地写出在Scalaz 7中已经提供的双重对象的功能和实例?

解决方法

引用 Lars Hupel从Twitter in response to this question:

I have no idea what our bimap is or what’s it supposed to do.

和:

Related: The T part of BijectionT is probably wrong. It probably needs to be rewritten to look like the Haskell version.

所以答案显然不是,我没有丢失任何东西,这实际上是当前API中的差距,可能会在将来的Scalaz版本中被修复。

(编辑:李大同)

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

    推荐文章
      热点阅读