27 votes

Comment les foncteurs dans Haskell et OCaml sont-ils similaires?

J'ai pensé dans un Haskell pour la dernière année et je suis en train de commencer à 'get' ce, jusqu'à ce que les Monades, les objectifs, le Type de Familles, ... le lot.

Je suis sur le point de quitter cette zone de confort un peu et je suis passer à OCaml projet comme un travail de jour. En passant par la syntaxe un peu, j'ai été à la recherche pour plus niveau des concepts, comme par exemple foncteur.

J'ai lu le code en OCaml et la structure d'un foncteur mais je n'arrive pas à obtenir qu'ils sont maintenant des concepts similaires dans Haskell et OCaml ou pas. En un mot, un foncteur en Haskell est pour moi surtout un moyen de lever des fonctions en Haskell et je l'utilise (et comme ça) comme ça. En OCaml, il me donne le sentiment que c'est plus proche de la programmation d'une interface (par exemple lors de la prise d'un ensemble ou une liste, avec la fonction de comparaison) et je ne sais vraiment pas comment, par exemple, soulever des fonctions via le foncteur ou donc.

Quelqu'un peut-il m'expliquer si les deux concepts sont similaires et si oui, que suis-je en manquant ou ne pas voir? J'ai googlé un peu et il ne semble pas être une réponse claire à être trouvé.

Kasper

31voto

Tikhon Jelvis Points 30789

À partir d'un point de vue pratique, vous pouvez penser à "foncteurs" en OCaml et Haskell comme étant liés. Comme vous l'avez dit, en Haskell un foncteur est n'importe quel type qui vous permet de mapper une fonction sur elle. En OCaml, un foncteur est un module paramétrés par un autre module.

En Programmation Fonctionnelle, ce qui est un foncteur? a une bonne description de ce que les foncteurs dans les deux langues sont et comment ils diffèrent.

Cependant, comme son nom l'indique, il y a effectivement un lien entre les deux apparemment disparates concepts! Les deux langue de foncteurs sont quelques réalisations d'un concept à partir de la catégorie de la théorie.

Catégorie de la théorie est l'étude des catégories, qui sont un peu arbitraire des collections d'objets avec "morphisms" entre eux. L'idée d'une catégorie est très abstrait, donc des "objets" et "morphisms" peut vraiment être n'importe quoi, avec quelques restrictions-il y a une identité morphism pour chaque objet et morphisms ont à composer.

L'exemple le plus évident d'une catégorie est la catégorie des ensembles et fonctions: les jeux sont les objets et les fonctions entre les séries de la morphisms. Clairement, chaque jeu a une fonction d'identification et de fonctions peut être composé. Très semblable à la catégorie peut être formé à partir d'un langage de programmation fonctionnel comme Haskell ou OCaml: types de béton (par exemple: types avec l'aimable *) sont les objets et Haskell/fonctions OCaml sont les morphisms entre eux.

Dans la catégorie théorie, un foncteur est une transformation entre les catégories. C'est comme une fonction entre les catégories. Lorsque nous sommes à la recherche à la catégorie de Haskell types, un foncteur est essentiellement un type de fonction de niveau: il cartes de types à autre chose. Le type particulier de foncteur nous nous soucions de cartes de types autres types. Un parfait exemple de cela est Maybe: Maybe maps Int de Maybe Int, String de Maybe String et ainsi de suite. Il fournit une cartographie de tous les possibles Haskell type.

Foncteurs ont une exigence additionnelle-ils ont de la carte la catégorie morphisms ainsi que les objets. En particulier, si nous avons un morphism A → B et notre foncteur maps A de A' et B de B', il a à la carte le morphism A → B pour certains morphism A' → B'. À titre d'exemple concret, disons-nous les types Int et String. Il y a tout un tas de Haskell fonctions Int → String. Pour Maybe être un bon foncteur, il doit avoir une fonction Maybe Int → Maybe String pour chacun de ces.

Heureusement, c'est exactement ce que l' fmap de la fonction t-il des cartes de fonctions. Pour Maybe, il a le type (a → b) → Maybe a → Maybe b; on peut ajouter des parenthèses pour obtenir: (a → b) → (Maybe a → Maybe b). Ce que ce type de signature nous dit, c'est que, pour une fonction normale, nous avons, nous avons aussi une fonction correspondante sur Maybes.

Donc un foncteur est une correspondance entre les types qui préserve également les fonctions entre elles. L' fmap fonction est essentiellement juste une preuve de cette deuxième restriction sur les foncteurs. Cela rend plus facile de voir comment le Haskell Functor classe est juste une version particulière du concept mathématique.

Donc, qu'en OCaml? En OCaml, un foncteur n'est pas un type, c'est un module. En particulier, c'est un paramétrées module: un module qui prend un autre module comme un argument. Déjà, on peut voir quelques parallèles: en Haskell, un Functor , c'est comme un type de fonction de niveau; en OCaml, un foncteur est comme un modulede fonction de niveau. Alors, vraiment, c'est la même idée mathématique; cependant, au lieu d'être utilisé sur des typescomme en Haskell-il est utilisé sur les modules.

Il y a beaucoup plus de détails sur la façon OCaml foncteurs liées à la catégorie de la théorie des foncteurs sur le CS du site: Quelle est la relation entre foncteurs dans le SML et la Catégorie de la théorie?. La question parle SML plutôt que d'OCaml en soi, mais ma compréhension est que le module de système d'OCaml est très étroitement liée à celle du SML.

En résumé: les foncteurs en Haskell et OCaml sont deux fondamentalement différentes structures à la fois arriver à être reifications de même très abstrait idée mathématique. Je pense que c'est plutôt sympa :).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X