2016-11-02 1 views
0

Comme je sais functor est une fonction renvoyant un module d'autre moduleest appliquer la méthode dans le compagnon de l'objet compagnon dans scala?

telle que sa signature est * -> *

par définition, est la méthode apply Companion objet un foncteur ??

Par exemple,

case class A(id: Double) 
object A { 
    def apply(intId: Int) = A(intId.toDouble) // Functor: Double -> A 
} 

Ai-je raison ??

Mes questions sont

1) peuvent apply méthode dans l'objet compagnon être considérés comme Functor?

2) Si functor est une fonction juste que créer une instance d'un autre exemple, quelle est la différence entre foncteur et constructeur

+0

De quel foncteur parlons-nous? La définition mathématique ou celle de scalaz/cats? –

+0

@YuvalItzchakov Merci pour votre commentaire. Je parle de la définition mathématique du foncteur. –

+1

@YuvalItzchakov: Il semble que l'OP parle du concept ML d'un Functor, où les Functors sont une caractéristique du système de modules. Les modules de ML ne sont pas de première classe, vous ne pouvez donc pas les transmettre à une fonction ou les renvoyer d'une fonction. Les foncteurs sont essentiellement des fonctions à l'intérieur du système de modules: ils prennent des modules comme arguments et des modules de retour. (Une autre signification de Functor est celle de C++, qui signifie fondamentalement tout objet qui a 'operator()'.) –

Répondre

1

D'abord, ce n'est pas une définition de rien:

Comme je l'ai savoir foncteur est une fonction renvoyant un module d'autre module
tel que sa signature est * -> *

Et dans le contexte de la Scala, qui mo dules parlez-vous?

Si vous êtes talking about mathematical definition of functor, nous allons d'abord préciser ce qui est un functor in mathematics:

Un foncteur entre deux categories est une paire de cartes: entre leurs objets et leurs morphismes, de telle sorte qu'ils répondent certains axiomes (en bref qu'il respecte la source/cible des morphismes et respecte la composition). Donc d'abord, avant de parler de foncteurs, il faut d'abord mettre en place un contexte: un foncteur entre quelles catégories? Quels sont leurs objets et quels sont leurs morphismes?

Ensuite, vous pouvez définir un foncteur en définissant comment il mappe ces objets et comment il mappe les morphismes.

Donc, je ne peux pas donner de réponses à vos questions, parce que 1) une méthode est juste une carte entre les valeurs de deux types, où sont les catégories ici? 2) l'expression "le foncteur est une fonction juste" n'a pas de sens.


Maintenant, le contexte habituel dans lequel les gens parlent de functors in programming en général et in Scala in particular est en définissant une catégorie qui a (Scala) types comme ses objets et fonctions comme ses mophisms.

Ensuite, vous pouvez considérer les foncteurs de cette catégorie à lui-même (qui sont appelés endofunctors), donc dans Scala il peut s'agir de n'importe quel type paramétré, que vous pouvez mapper.Par exemple, vous pouvez voir List[_] comme foncteur:

  • mappe tout type A taper List[A]
  • et en utilisant c'est la méthode .map vous pouvez mapper une fonction A => B à une fonction List[A] => List[B]

Pour être un vrai foncteur, il a aussi satisfait les axiomes mentionnés, mais laissons-les de côté pour la simplicité. Un autre exemple de catégorie dans le contexte de Scala (ou d'un langage de programmation similaire) est celui avec les types Scala (encore) comme objets et les morphismes étant la relation de sous-type: A :> B.

Vérifiez les questions liées liées pour plus de détails et d'exemples. Donc, si vous pouvez fournir assez d'un tel contexte, alors mettez à jour votre question et demandez dans les commentaires si vous ne comprenez pas quelque chose.