【问题标题】:What is functor bias?什么是函子偏差?
【发布时间】:2018-02-12 01:34:17
【问题描述】:

C++ Functors - and their uses 开始,我遇到了“右偏函子”和“左偏函子”。我试图自己做一些研究,但我仍然无法理解两者之间的区别,甚至函子偏差是什么。

有人可以概述一下什么是函子偏差,右偏差和左偏差之间的区别,以及任何有用的例子吗?如果 Scala 可以用于示例,那就太好了。

【问题讨论】:

  • 不幸的是,“函子”这个词最终在不同的社区中以完全不同的方式使用。 C++“仿函数”不是标准 ML “仿函数”不是 Scala/Haskell/category-theory “仿函数”。

标签: scala functional-programming scalaz


【解决方案1】:

scala 中的函子与 C++ 中的函子并不完全相同。它是一个具有类似

操作的类别
  def map[A, B](fa: F[A])(f: A => B): F[B]

这会将F[A] 变成F[B],给定一个从AB 的转换器。

例如,Option 是一个仿函数,它在定义内部值时将转换应用于内部值。 List 是一个仿函数,它将转换器应用于每个元素等。

现在,考虑一下Either[A, B]。假设,我们想为此定义一个函子。它有两个类型参数,但Functor 只有一个,所以我们必须选择Functor 将在哪个上运行。通常以某种方式使用Either,其中Right 是默认情况,Left 是异常(错误条件)。因此,很自然地认为它偏右

  def eitherFunctor[T] = new Functor[Either[T, ?]] {
     def map(fa: Either[T, A])(f: A => B): Either[T, B] = fa match {   
        case Right(a) => Right(f(a))
        case Left(t) => Left(t)
     }
  }

这有点像Option.map:当EitherRight 时,它应用转换器,否则,只返回Left 不变。因此,可以说Either 是一个右偏函子,因为它只在其右侧运行。

【讨论】:

  • 谢谢,这更有意义。我正在尝试使用您提供的代码,并且在使用 IDE 甚至通过命令行使用 SBT 进行编译时遇到了很多麻烦。我想这可能是因为我们没有像编译器预期的那样覆盖map?另外,我们不需要在指定TeitherFunctor中指定其他类型参数,如?AB吗?
猜你喜欢
  • 2021-12-04
  • 2011-02-21
  • 2019-12-01
  • 2010-09-09
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
相关资源
最近更新 更多