什么是算子偏见?

时间:2018-02-12 01:34:18

标签: scala functional-programming scalaz

C++ Functors - and their uses跟进,我遇到了'正偏向的仿函数'和'左偏向的仿函数'。我试图自己做一些研究,但我仍然没有理解两者之间的差异,甚至算子偏见是什么。

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

1 个答案:

答案 0 :(得分:4)

scala中的Functor与他们在C ++中所称的内容完全相同。这是一个类似

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

F[A]变为F[B],并将A转换为B

例如,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是一个右偏的函子,因为它只在右侧运行。