首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将双射提升为函子

将双射提升为函子
EN

Stack Overflow用户
提问于 2013-10-18 17:18:44
回答 1查看 607关注 0票数 21

也许我遗漏了一些显而易见的东西,但我试图在一个使用Scalaz 7的项目中清理一些样板,而且我找不到一个看起来很简单也可能很有用的拼图。

假设我们在两种类型之间有一个双射:

代码语言:javascript
复制
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]之间的一个双射。我们可以很容易地编写一个提供此功能的隐式类(实际上,我们还可以让它对任何函子工作):

代码语言:javascript
复制
implicit class BijectionLifter[A, B](val bij: A <@> B) extends AnyVal {
  def liftInto[F[_]: Functor]: F[A] <@> F[B] = bijection[Id, Id, F[A], F[B]](
    _ map bij.to,
    _ map bij.from
  )
}

请注意,这是从Haskell的bimapData.Bijection中直接翻译出来的。Scalaz的bijection也有一个名为bimap的方法,但是它有一个更繁忙的类型,而且似乎没有以任何明显的方式完成我想做的事情。

现在,我们只需编写以下内容:

代码语言:javascript
复制
fb.liftInto[List]

我们得到了我们需要的双射。

我是不是缺少了一些抽象,这样我就可以用Scalaz 7中已经为双射提供的函数和实例更清晰地编写它了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-19 12:40:29

引用拉尔斯·乌佩尔 回答这个问题的话

我不知道我们的bimap是什么,也不知道它应该做什么。

和:

关联:BijectionTBijectionT部分可能是错误的。它可能需要重写,使之看起来像Haskell版本。

所以答案显然是否定的,我没有遗漏任何东西--这实际上是当前API中的一个空白,很可能会在未来的Scalaz版本中修复。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19455470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档