scala - 将双射提升为仿函数

标签 scala functor scalaz scalaz7 bijection

也许我遗漏了一些明显的东西,但我正在尝试清理使用 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, Id, F[A], F[B]](
    _ map bij.to,
    _ map bij.from
  )
}

请注意,这是 bimap 的直接翻译。来自 Haskell 的 Data.Bijection . Scalaz 的双射也有一个名为 bimap 的方法。 ,但它有一个更忙的类型,似乎并没有以任何明显的方式做我想做的事。

现在我们可以只写以下内容:
fb.liftInto[List]

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

我是否遗漏了一些抽象,使我可以使用 Scalaz 7 中已经为双射提供的函数和实例更清晰地编写它?

最佳答案

报价 Lars Hupel来自推特 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 中的一个缺口,可能会在 future 的 Scalaz 版本中得到修复。

关于scala - 将双射提升为仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19455470/

相关文章:

mongodb - 通过嵌套字段查询 ReactiveMongo

c++ - std::greater<int>() 和 std::greater<int> 之间的区别?

scala - 将 Scalaz 与 Spark 结合使用时出现不可序列化异常

scala - 为什么 Scalaz 7.1.5 中的 Free 不是 monad 实例?

scala - 如何将 Haskell 翻译成 Scalaz?

reflection - Scala:从字段名称反射地设置字段值

scala - 为什么列表和字符串标识符命名为 "xs"(在 Scala 和其他语言中)?

scala - 如何克隆迭代器?

c++ - 在不将类作为参数的情况下在成员函数内创建仿函数

c++ - 就内存使用而言,模板 + 仿函数/lambdas 不是最理想的吗?