【问题标题】:is apply method in companion object functor in scala?是scala中伴随对象函子中的应用方法吗?
【发布时间】:2016-11-02 04:00:43
【问题描述】:

据我所知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 是一个从其他实例创建实例的公正函数,那么函子和构造函数有什么区别

【问题讨论】:

  • 我们在谈论哪个函子?数学定义还是来自 scalaz/cats 的定义?
  • @YuvalItzchakov 感谢您的评论。我说的是函子的数学定义。
  • @YuvalItzchakov:看起来 OP 正在谈论 Functor 的 ML 概念,其中 Functor 是模块系统的一个特征。 ML 中的模块不是一流的,因此您不能将它们传递给函数或从函数返回它们。函子本质上是模块系统内部的函数:它们将模块作为参数并返回模块。 (Functor 的另一个含义是来自 C++ 的那个,它基本上意味着任何具有operator() 的对象。)

标签: scala functor


【解决方案1】:

首先,这不是对任何事物的定义:

据我所知,函子是一个从其他模块返回模块的函数
这样它的签名是 * -> *

在 Scala 的上下文中,您指的是哪些模块?

如果你是talking about mathematical definition of functor,让我们先弄清楚什么是functor in mathematics

两个categories 之间的函子是一对映射:在它们的对象和它们的态射之间,这样它们就满足某些公理(简而言之,它尊重态射的源/目标并尊重组合)。

所以首先,在讨论任何函子之前,您需要设置一些上下文:函子在哪些类别之间?它们的对象是什么,它们的态射是什么?

然后您可以通过定义函子如何映射这些对象以及它如何映射态射来定义函子。

所以我无法回答你的问题,因为 1)方法只是两种类型值之间的映射,这里有什么类别吗? 2)“函子是一个公正的函数”这句话已经没有意义了。


现在,人们谈论functors in programmingin Scala in particular 的通常上下文是定义一个类别,该类别具有(Scala)types 作为其对象和函数 em> 作为它的 mophisms。

然后您可以考虑从这个类别到自身的函子(称为 endofunctors),因此在 Scala 中它可以是任何参数化类型,您可以对其进行映射。例如,您可以将List[_] 视为函子:

  • 它将任何类型A 映射到类型List[A]
  • 并通过使用它的方法.map,您可以将函数A => B映射到函数List[A] => List[B]

要成为一个真正的函子,它也满足上述公理,但为了简单起见,我们将它们放在一边。

另一个在 Scala(或任何类似编程语言)上下文中的类别示例是将 Scala 类型(再次)作为对象,而态射是子类型关系:A :> B

查看链接的相关问题以获取更多详细信息和示例。


因此,如果您可以提供足够多的此类上下文,请更新您的问题,如果您有不明白的地方,请在 cmets 中提问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多