从C++ Functors - and their uses跟进,我遇到了'正偏向的仿函数'和'左偏向的仿函数'。我试图自己做一些研究,但我仍然没有理解两者之间的差异,甚至算子偏见是什么。
有人可以概述一下算子偏见是什么,右偏差和左偏差之间的区别,以及这个有用的例子吗?如果可以将Scala用于示例,那就太好了。
答案 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
:当Either
是Right
时,它会应用变换器,否则只返回Left
未触及的。因此,可以说Either
是一个右偏的函子,因为它只在右侧运行。