作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在阅读此博客上对 Functors 的描述时:
https://hseeberger.wordpress.com/2010/11/25/introduction-to-category-theory-in-scala/
有一个 Functor 的通用定义和一个更具体的定义:
trait GenericFunctor[->>[_, _], ->>>[_, _], F[_]] {
def fmap[A, B](f: A ->> B): F[A] ->>> F[B]
}
trait Functor[F[_]] extends GenericFunctor[Function, Function, F] {
final def fmap[A, B](as: F[A])(f: A => B): F[B] =
fmap(f)(as)
}
object Functor {
def fmap[A, B, F[_]](as: F[A])(f: A => B)(implicit functor: Functor[F]): F[B] =
functor.fmap(as)(f)
implicit object ListFunctor extends Functor[List] {
def fmap[A, B](f: A => B): List[A] => List[B] =
as => as map f
}
}
scala> fmap(List(1, 2, 3))(x => x + 1)
res0: List[Int] = List(2, 3, 4)
最佳答案
在您的示例中 Functor
是 Scala 类型范畴中的一个内仿函数,具有 Function1
作为箭头。
还有其他类别。例如,假设一个类别中的对象是 Scala 类型,并且有一个箭头 A >~> B
如果 B
是 A
的子类型.此类别在 Scalaz被称为 Liskov
.有一个来自 Liskov
的“健忘”仿函数类别到 Function1
类别:
import scalaz._
import Scalaz._
trait Forget[F[-_]] extends GenericFunctor[>~>, Function1, F] {
def fmap[A, B](f: A >~> B): F[A] => F[B] = fa => f.subst(fa)
}
GenericFunctor
来构建一些有趣的仿函数。 .例如...
type ConstantFunctor[->>[_, _], ->>>[_, _], C] =
GenericFunctor[->>,->>>,({type F[x] = C})#F]
// def fmap[A, B](f: A ->> B): C ->>> C
type EndoFunctor[->>[_, _], F[_]] = GenericFunctor[->>, ->>, F]
// def fmap[A, B](f: A ->> B): F[A] ->> F[B]
type IdentityFunctor[->>[_, _]] = EndoFunctor[->>, ({type F[x] = x})#F]
// def fmap[A, B](f: A ->> B): A ->> B
Functor
trait 只是一个
EndoFunctor
在
Function1
类别。
type Functor[F[_]] = EndoFunctor[Function1, F]
// def fmap[A, B](f: A => B): F[A] => F[B]
关于function - Scala -- 如何在非函数类型上使用仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7571959/
我是一名优秀的程序员,十分优秀!