据我所知functor
是一个从其他模块返回模块的函数
使其签名为* -> *
然后根据定义,Companion对象中的apply
方法是一个仿函数吗?
例如,
case class A(id: Double)
object A {
def apply(intId: Int) = A(intId.toDouble) // Functor: Double -> A
}
我是对的?
我的问题是
1)伴侣对象中的apply
方法可以被视为Functor吗?
2)如果functor
是一个只是从其他实例创建实例的函数,那么仿函数和构造函数之间有什么区别
答案 0 :(得分:1)
首先,这不是任何事物的定义:
据我所知,仿函数是一个从其他模块返回模块的函数
这样它的签名是* - > *
在Scala的上下文中,您在谈论哪些模块?
如果你是talking about mathematical definition of functor,我们首先澄清什么是functor in mathematics:
两个categories之间的仿函数是一对地图:在它们的对象和它们的状态之间,以便它们满足某些公理(简而言之,它尊重态射的来源/目标并尊重作曲)。
首先,在谈论任何仿函数之前,您需要设置一些上下文:一个类别之间的仿函数?他们的对象是什么,他们的态射是什么?
然后,您可以通过定义仿函数如何映射这些对象以及如何映射态射来定义仿函数。
所以我无法回答你的问题,因为 1)方法只是两种类型值之间的映射,这里的任何类别都在哪里? 2)短语“functor is just function”已经没有意义了。
现在,人们通常会谈到functors in programming和in Scala in particular的通常情况是定义一个类别,其中包含(Scala) types 作为其对象和函数作为其mophisms。
然后你可以考虑从这个类别到它自己的函子(它们被称为 endofunctors ),所以在Scala中它可以是任何参数化类型,你可以映射。例如,您可以将List[_]
视为仿函数:
A
映射到List[A]
.map
,您可以将函数A => B
映射到函数List[A] => List[B]
要成为一个真正的仿函数,它也满足了上面提到的公理,但为了简单起见,让我们把它们放在一边。
Scala(或任何类似的编程语言)上下文中的类别的另一个示例是Scala类型(再次)作为对象,而态射是子类型关系:A :> B
。
查看链接的相关问题以获取更多详细信息和示例。
因此,如果您能提供足够的上下文,那么请更新您的问题并在评论中询问您是否理解不了解。