Ce n' “coalgebra” signifie dans le contexte de la programmation?
J'ai entendu le terme "coalgebras" plusieurs fois dans la programmation fonctionnelle et PLT cercles, surtout quand la discussion est sur les objets, comonads, des lentilles, et tels. Googler ce terme donne des pages qui donnent la description mathématique de ces structures qui est à peu près incompréhensible pour moi. Quelqu'un peut-il expliquer ce qu'est coalgebras dans le contexte de la programmation, quelle est leur signification, et comment ils se rapportent à des objets et comonads?
- Pourrais-je vous recommandons de Jeremy Gibbons' excellent livre de Modèles dans FP: patternsinfp.wordpress.com et son tout à fait compréhensible papier "Calcul de la Fonctionnelle de Programmes"? Elles couvrent coalgebras dans un très rigoureuse de la mode (par rapport à, par exemple, un billet de blog), mais ils sont aussi assez autonome pour quelqu'un qui sait un peu de Haskell.
- très intéressante. Merci!
Vous devez vous connecter pour publier un commentaire.
Algèbres de
Je pense que l'endroit pour commencer serait de comprendre l'idée d'un algèbre. C'est juste une généralisation de structures algébriques comme les groupes, les anneaux, les monoids et ainsi de suite. La plupart du temps, ces choses sont mis en place en termes de jeux, mais puisque nous sommes entre amis, je vais vous parler d'Haskell plutôt les types de. (Je ne peux pas résister à l'aide de quelques lettres grecques cependant, ils font tout plus froid!)
Une algèbre, alors, c'est juste un type
τ
avec certaines fonctions et des identités. Ces fonctions prennent des nombres des arguments de typeτ
et de produire unτ
: uncurried, elles ressemblent toutes à(τ, τ,…, τ) → τ
. Ils peuvent aussi avoir des "identités"—éléments deτ
qui ont un comportement particulier avec certaines fonctions.L'exemple le plus simple de ce est le monoïde. Un monoïde est tout type
τ
avec une fonctionmappend ∷ (τ, τ) → τ
et une identitémzero ∷ τ
. D'autres exemples comprennent des choses comme des groupes (qui sont comme monoids sauf avec un supplément deinvert ∷ τ → τ
fonction), des anneaux, des grilles et ainsi de suite.Toutes les fonctions fonctionnent sur
τ
mais peut avoir différentes arities. On peut l'écrire commeτⁿ → τ
, oùτⁿ
correspond à un tuple den
τ
. De cette manière, il est logique de penser les identitésτ⁰ → τ
oùτ⁰
est juste le vide tuple()
. Alors, nous pouvons simplifier l'idée d'une algèbre de maintenant: c'est juste un type avec un certain nombre de fonctions sur elle.Une algèbre est juste un modèle commun en mathématiques qui a été "pris en compte", tout comme nous le faisons avec le code. Les gens ont remarqué que tout un tas de choses intéressantes—la susmentionnés monoids, des groupes, des réseaux et tous ce qui suivent un schéma similaire, de sorte qu'ils abstraction de ça. L'avantage de ce mode est le même que dans la programmation: il crée réutilisables preuves et rend certains types de raisonnement plus facile.
F-Algèbres
Cependant, nous ne sommes pas tout à fait fini avec l'affacturage. Jusqu'à présent, nous avons un tas de fonctions
τⁿ → τ
. Nous pouvons réellement faire un truc intéressant pour les combiner en une seule fonction. En particulier, regardons monoids: nous avonsmappend ∷ (τ, τ) → τ
etmempty ∷ () → τ
. Nous pouvons les transformer en une seule fonction à l'aide d'un type de somme—Either
. Il devrait ressembler à ceci:Nous pouvons utiliser cette transformation à plusieurs reprises pour combiner tous la
τⁿ → τ
fonctions en un seul, pour tout de l'algèbre. (En fait, nous pouvons le faire pour n'importe quel nombre de fonctionsa → τ
,b → τ
et ainsi de suite pour touta, b,…
.)Cela nous permet de parler d'algèbres de type
τ
avec un unique fonction de certains désordre deEither
s à un seulτ
. Pour monoids, ce gâchis est:Either (τ, τ) ()
; pour les groupes (qui ont un supplément deτ → τ
de l'opération), c'est:Either (Either (τ, τ) τ) ()
. C'est un type différent pour chaque structure. Alors, que faire de tous ces types ont en commun? La chose la plus évidente est qu'ils sont tous simplement des sommes de produits—types de données algébriques. Par exemple, pour monoids, on pourrait créer un monoïde type d'argument qui fonctionne pour tout monoïde τ:Nous pouvons faire la même chose pour les groupes et les anneaux et les grilles et tous les autres structures possibles.
Quoi d'autre est spécial au sujet de ces types? Eh bien, ils sont tous
Functors
! E. g.:De sorte que nous pouvons généraliser nos idée d'une algèbre de même plus. C'est juste un type
τ
avec une fonctionf τ → τ
pour certains foncteurf
. En fait, on peut écrire ceci comme un typeclass:Ceci est souvent appelé un "F-algèbre" parce qu'il est déterminé par le foncteur
F
. Si nous pouvions appliquer partiellement typeclasses, nous pourrions définir quelque chose commeclass Monoid = Algebra MonoidArgument
.Coalgebras
Maintenant, j'espère que vous avez une bonne compréhension de ce qu'est une algèbre est et comment il est juste une généralisation de la normale structures algébriques. Donc qu'est ce qu'un F-coalgebra? Eh bien, le co suppose que c'est le "double" d'une algèbre—qui est, nous prenons une algèbre de flip et quelques flèches. Je ne vois qu'une seule flèche dans la définition ci-dessus, donc je vais juste flip que:
Et c'est tout ce qu'il est! Maintenant, cette conclusion peut sembler un peu désinvolte (heh). Il vous dit ce un coalgebra est, mais n'a pas vraiment donner quelque indication sur la façon dont il est utile ou pourquoi nous nous occupons. Je vais obtenir dans un instant, une fois que j'ai trouver ou proposer un bon exemple ou deux :P.
Les Classes et les Objets
Après avoir lu un peu, je pense avoir une bonne idée de la façon d'utiliser coalgebras pour représenter les classes et les objets. Nous avons un type
C
qui contient tous les états internes des objets dans la classe; la classe elle-même est un coalgebra surC
qui spécifie les méthodes et propriétés des objets.Comme indiqué dans l'algèbre exemple, si nous avons un tas de fonctions comme
a → τ
etb → τ
pour touta, b,…
, nous pouvons les combiner en une seule fonction à l'aide deEither
, un type somme. Le double "notion" serait combinant un tas de fonctions de typeτ → a
,τ → b
et ainsi de suite. Nous pouvons faire cela en utilisant le dual d'un type de somme—un type de produit. Donc, étant donné que les deux fonctions ci-dessus (appeléf
etg
), nous pouvons créer un seul comme suit:Le type
(a, a)
est un foncteur dans la façon simple, de sorte qu'il correspond à notre notion de F-coalgebra. Cette astuce nous permet d'empaqueter un tas de différentes fonctions—ou, pour la programmation orientée objet, les méthodes en une seule fonction de typeτ → f τ
.Les éléments de notre type
C
représentent la interne état de l'objet. Si l'objet a une certaine lisible propriétés, ils doivent être en mesure de compter sur l'état. Le moyen le plus évident pour ce faire est de faire une fonction deC
. Donc, si nous voulons une longueur de propriété (par exemple,object.length
), on aurait une fonctionC → Int
.Nous voulons méthodes que peut prendre un argument d'état et les modifier. Pour ce faire, nous avons besoin de tous les arguments et de produire un nouveau
C
. Imaginons unsetPosition
méthode qui prend unx
et uny
coordonnées:object.setPosition(1, 2)
. Il devrait ressembler à ceci:C → ((Int, Int) → C)
.Le modèle important ici est que les "méthodes" et "propriétés" de l'objet, l'objet lui-même comme premier argument. C'est exactement comme les
self
paramètre en Python et comme l'implicitethis
de nombreuses autres langues. Un coalgebra essentiellement juste encapsule le comportement de la prise d'unself
paramètre: c'est que le premierC
dansC → F C
est.Donc, nous allons mettre tout cela ensemble. Imaginons une classe avec un
position
de la propriété, unname
propriété etsetPosition
fonction:Nous avons besoin de deux pièces de représenter cette classe. Tout d'abord, nous avons besoin de représenter l'état interne de l'objet; dans ce cas, il tient juste deux
Int
s et unString
. (C'est notre type deC
.) Ensuite, nous avons besoin de venir avec le coalgebra représentant la classe.Nous avons deux propriétés à écrire. Ils sont assez trivial:
Maintenant nous avons juste besoin d'être en mesure de mettre à jour la position:
C'est juste comme un Python de classe avec ses explicite
self
variables. Maintenant que nous avons un tas deself →
fonctions, il faut les combiner en une seule fonction pour la coalgebra. Nous pouvons faire cela avec un simple tuple:Le type
((Int, Int), String, (Int, Int) → c)
—pour toutc
—est un foncteur, donccoop
ne sont de la forme que nous voulons:Functor f ⇒ C → f C
.Compte tenu de cela,
C
aveccoop
forme d'un coalgebra qui spécifie la classe que j'ai donné ci-dessus. Vous pouvez voir comment nous pouvons utiliser cette même technique pour spécifier n'importe quel nombre de méthodes et de propriétés pour nos objets ont.Cela nous permet d'utiliser la coalgebraic raisonnement pour traiter avec les classes. Par exemple, nous pouvons introduire dans la notion de "F-coalgebra homomorphism" pour représenter les transformations entre les classes. C'est un effrayant terme à consonance qui signifie simplement une transformation entre coalgebras qui préserve la structure. Cela le rend beaucoup plus facile de penser à la cartographie des classes sur les autres classes.
En bref, un F-coalgebra représente une classe en ayant un tas de propriétés et de méthodes reposent toutes sur un
self
paramètre contenant chaque objet interne de l'état.Autres Catégories
Jusqu'à présent, nous avons parlé des algèbres et coalgebras comme Haskell types. Une algèbre est juste un type
τ
avec une fonctionf τ → τ
et un coalgebra est juste un typeτ
avec une fonctionτ → f τ
.Cependant, rien ne relie ces idées à Haskell soi. En fait, ils sont généralement mis en place en termes d'ensembles et de fonctions mathématiques plutôt que de types et Haskell fonctions. En effet,nous pouvons généraliser ces concepts à tout catégories!
Nous pouvons définir une F-algèbre pour certaines catégorie
C
. Tout d'abord, nous avons besoin d'un foncteurF : C → C
—qui est, un endofunctor. (Tous les HaskellFunctor
s sont en fait endofunctors deHask → Hask
.) Ensuite, une algèbre est juste un objetA
deC
avec un morphismF A → A
. Un coalgebra est le même, sauf avecA → F A
.Ce que nous gagnons en considérant d'autres catégories? Eh bien, nous pouvons utiliser les mêmes idées dans des contextes différents. Comme les monades. En Haskell, une monade est un certain type
M ∷ ★ → ★
avec trois opérations:La
map
fonction est juste une preuve du fait queM
est unFunctor
. On peut donc dire qu'une monade est juste un foncteur avec deux opérations:return
etjoin
.Foncteurs forment une catégorie eux-mêmes, avec morphisms entre eux étant soi-disant "les transformations naturelles". Une transformation naturelle est juste une façon de transformer un foncteur dans un autre, tout en préservant sa structure. Voici un bel article qui explique en partie l'idée. Il parle de
concat
, qui est justejoin
pour les listes.Avec Haskell foncteurs, la composition de deux foncteurs est un foncteur lui-même. En pseudo-code, on pourrait écrire ceci:
Cela nous aide à penser
join
comme une cartographie def ∘ f → f
. Le type dejoin
est∀α. f (f α) → f α
. Intuitivement, nous pouvons voir comment une fonction valide pour tous typesα
peut être considéré comme une transformation def
.return
est une transformation similaire. Son type est∀α. α → f α
. Cela ressemble différentes—la premièreα
n'est pas "dans" un foncteur! Heureusement, nous pouvons résoudre ce problème en ajoutant une identité foncteur là:∀α. Identity α → f α
. Doncreturn
est une transformationIdentity → f
.Maintenant, nous pouvons penser à une monade comme juste une algèbre de autour de quelques foncteur
f
avec des opérationsf ∘ f → f
etIdentity → f
. N'est-ce pas vous semble familière? Il est très similaire à un monoïde, qui était juste un typeτ
avec des opérationsτ × τ → τ
et() → τ
.Donc une monade est juste comme un monoïde, sauf qu'au lieu d'avoir un type que nous avons un foncteur. C'est le genre même de l'algèbre, de la, juste dans une catégorie différente. (C'est là que la phrase "Une monade est juste un monoïde dans la catégorie des endofunctors" vient d'aussi loin que je sais.)
Maintenant, nous avons ces deux opérations:
f ∘ f → f
etIdentity → f
. Correspondant à l'coalgebra, nous avons il suffit de retourner les flèches. Cela nous donne deux nouvelles opérations:f → f ∘ f
etf → Identity
. Nous pouvons les transformer en Haskell types par l'ajout de variables de type que ci-dessus, nous donnant∀α. f α → f (f α)
et∀α. f α → α
. Cela ressemble tout à fait à la définition d'un comonad:Donc un comonad est alors un coalgebra dans une catégorie de endofunctors.
(,)
et l'identité foncteur de()
. Un monoïde objet à l'intérieur d'un monoidal catégorie est un objet avec des flèches correspondant à votre résumant les propriétés de l'algèbre, qui décrit un monoïde objet dans Hask avec les types de produits comme les monoidal structure. Un monoïde objet dans la catégorie des endofunctors sur C est une monade sur C, alors oui, votre compréhension est correcte. :]setPosition
sur un objet une fois, nous n'allons pas appeler ça une autre fois sur la même "vieux" etat de l'objet: il faut utiliser la fonction "mise à jour" de l'état. En Haskell, c'est un problème bien connu semblable à celui résolu par IO monade. Ainsi, pour simuler la programmation orientée objet, nous devrions restreindre CoAlgebra utilise par une monade, ne devrions-nous pas? (Par exemple, si le CoAlgebra est un Haskell interface à un réel étrangères de la programmation orientée objet système.)fmap f
et puisFunctor f
, les deux ayant unf τ
mais où les deuxf
etτ
ont des significations différentes.F-algèbres et F-coalgebras sont des structures mathématiques qui sont déterminants dans le raisonnement sur types inductifs (ou récursive types).
F-algèbres de
Nous allons commencer d'abord avec F-algèbres. Je vais essayer d'être aussi simple que possible.
Je suppose que vous savez ce qu'est un type récursif. Par exemple, c'est un type pour une liste d'entiers:
Il est évident que c'est récursive - en effet, sa définition se réfère à lui-même. Sa définition se compose de deux constructeurs de données, qui ont les types suivants:
Note que j'ai écrite type de
Nil
comme() -> IntList
, pas simplementIntList
. Ce sont en fait des types équivalents du point de vue théorique, parce que()
type n'a qu'un seul habitant.Si nous écrire des signatures de ces fonctions dans une série de plus-théorique, nous allons obtenir
où
1
est une unité d'ensemble (ensemble avec un seul élément) etA × B
opération de la croix est un produit de deux ensemblesA
etB
(qui est, jeu de paires(a, b)
oùa
passe par tous les éléments deA
etb
passe par tous les éléments deB
).Union disjointe de deux ensembles
A
etB
est un ensembleA | B
qui est une union d'ensembles{(a, 1) : a in A}
et{(b, 2) : b in B}
. Il s'agit essentiellement d'un ensemble de tous les éléments des deuxA
etB
, mais avec chacun de ces éléments "marqué" comme relevantA
ouB
, donc quand on choisir n'importe quel élément deA | B
nous allons tout de suite savoir si cet élément est venu deA
ou deB
.Nous pouvons "rejoindre"
Nil
etCons
fonctions, de sorte qu'ils forment une seule fonction à travailler sur un ensemble1 | (Int × IntList)
:En effet, si
Nil|Cons
fonction est appliquée à()
valeur (qui, de toute évidence, appartient à1 | (Int × IntList)
set), puis il se comporte comme si elle étaitNil
; siNil|Cons
est appliquée à n'importe quelle valeur de type(Int, IntList)
(ces valeurs sont aussi dans l'ensemble1 | (Int × IntList)
, il se comporte commeCons
.Considérons maintenant un autre type de données:
Voici les constructeurs:
qui peuvent être combinés en une seule fonction:
Il peut être vu que de cette
joined
fonctions de type similaire: ils ressemblent à desoù
F
est une sorte de transformation qui prend notre type et donne plus de type complexe, qui se compose dex
et|
opérations, les usages deT
et éventuellement d'autres types. Par exemple, pourIntList
etIntTree
F
se présente comme suit:On peut immédiatement remarquer que tout algébrique de type peut être écrit de cette manière. En effet, c'est pourquoi ils sont appelés "algébrique": ils se composent d'un certain nombre de 'sommes' (syndicats) et les "produits" (la croix-produits) d'autres types.
Nous pouvons maintenant définir la F-algèbre. F-algèbre est juste une paire
(T, f)
, oùT
est un certain type def
est une fonction de typef :: F T -> T
. Dans nos exemples, F-algèbres sont(IntList, Nil|Cons)
et(IntTree, Leaf|Branch)
. Notez, cependant, qu'en dépit de ce type def
la fonction est la même pour chaque F,T
etf
eux-mêmes peuvent être arbitraires. Par exemple,(String, g :: 1 | (Int x String) -> String)
ou(Double, h :: Int | (Double, Double) -> Double)
pour certainsg
eth
sont également F-algèbres de F.Par la suite, nous pouvons introduire F-algèbre homomorphisms et puis initiale F-algèbres, qui ont des propriétés très utiles. En fait,
(IntList, Nil|Cons)
est une première F1-algèbre, et(IntTree, Leaf|Branch)
est une première F2-algèbre. Je ne vais pas présenter des définitions exactes de ces conditions et les propriétés, car elles sont plus complexes et abstraits que nécessaire.Néanmoins, le fait que, disons,
(IntList, Nil|Cons)
est F-algèbre nous permet de définirfold
-comme la fonction de ce type. Comme vous le savez, fold est un type d'opération qui transforme certains récursif de type de données dans une valeur finie. Par exemple, nous pouvons plier une liste d'entiers en une seule valeur qui est la somme de tous les éléments dans la liste:Il est possible de généraliser une telle opération sur n'importe quel type de données récursive.
Ce qui suit est une signature de
foldr
fonction:Noter que j'ai utilisé des accolades pour séparer les deux premiers arguments de la dernière. Ce n'est pas vrai
foldr
fonction, mais il est isomorphe a ' (que vous pouvez facilement obtenir l'un de l'autre et vice-versa). Partiellement appliquéefoldr
va avoir la signature suivante:Nous pouvons voir que c'est une fonction qui prend une liste d'entiers et retourne un entier. Nous allons définir une telle fonction en termes de notre
IntList
type.Nous voyons que cette fonction se compose de deux parties: la première partie définit cette fonction du comportement sur
Nil
partie deIntList
, et de la deuxième partie définit la fonction du comportement surCons
partie.Supposons maintenant que nous sommes de programmation pas en Haskell, mais dans une langue qui permet l'utilisation de types algébriques directement dans le type de signatures (enfin, techniquement Haskell permet l'utilisation de types algébriques par des n-uplets et
Either a b
type de données, mais cela va conduire à d'inutiles verbosité). Considérons une fonction:Il peut être vu que
reductor
est une fonction de typeF1 Int -> Int
, tout comme dans la définition de la F-algèbre! En effet, la paire(Int, reductor)
est un F1-algèbre.Parce que
IntList
est une première F1-algèbre, pour chaque type deT
et pour chaque fonctionr :: F1 T -> T
il existe une fonction, appelé catamorphism pourr
, qui convertitIntList
àT
, et ce genre de fonction est unique. En effet, dans notre exemple, un catamorphism pourreductor
estsumFold
. Notez commentreductor
etsumFold
sont similaires: ils ont presque la même structure! Dansreductor
définitions
d'utilisation de ce paramètre (type de ce qui correspond àT
) correspond à l'utilisation du résultat de calcul desumFold xs
danssumFold
définition.Juste pour le rendre plus clair et vous aider à voir le patron, ici, est un autre exemple, et nous avons de nouveau commencer résultant de la fonction de pliage. Envisager
append
fonction qui ajoute son premier argument, le deuxième, un:Ce à quoi il ressemble sur notre
IntList
:Encore une fois, nous allons essayer d'écrire le réducteur:
appendFold
est un catamorphism pourappendReductor
qui transformeIntList
enIntList
.Donc, essentiellement, F-algèbres de nous permettre de définir les "plis" sur les structures de données récursives, qui est, les opérations qui permettent de réduire nos structures à une certaine valeur.
F-coalgebras
F-coalgebras sont soi-disant 'dual' terme de F-algèbres. Ils nous permettent de définir
unfolds
pour les types de données, c'est un moyen de construire des structures récursives à partir d'une certaine valeur.Supposons que vous avez le type suivant:
C'est un courant infini des nombres entiers. Son seul constructeur a le type suivant:
Ou, en termes de jeux de
Haskell permet de correspondance du modèle sur les données constructeurs, de sorte que vous pouvez définir les fonctions suivantes de travail sur
IntStream
s:Vous pouvez naturellement "rejoindre" ces fonctions dans une seule fonction de type
IntStream -> Int × IntStream
:Remarquez comment le résultat de la fonction coïncide avec algébrique de notre
IntStream
type. Chose de similaire peut également être fait pour d'autres récursive types de données. Peut-être que vous avez déjà remarqué la répétition. Je fais référence à une famille de fonctions de typeoù
T
est un certain type. À partir de maintenant, nous allons définirMaintenant, F-coalgebra est une paire
(T, g)
, oùT
est un type etg
est une fonction de typeg :: T -> F T
. Par exemple,(IntStream, head&tail)
est un F1-coalgebra. Encore une fois, tout comme dans F-algèbres,g
etT
peut être arbitraire, par exemple,(String, h :: String -> Int x String)
est aussi une F1-coalgebra pour quelques heures.Parmi tous les F-coalgebras il y a des soi-disant terminal F-coalgebras, qui sont des doubles à l'initiale F-algèbres. Par exemple,
IntStream
est un terminal F-coalgebra. Cela signifie que pour chaque type deT
et pour chaque fonctionp :: T -> F1 T
il existe une fonction, appelé anamorphism, qui convertitT
àIntStream
, et ce genre de fonction est unique.Considérons la fonction suivante, qui génère un flux d'entiers successifs à partir de la donnée d'une:
Maintenant, nous allons inspecter une fonction
natsBuilder :: Int -> F1 Int
, qui est,natsBuilder :: Int -> Int × Int
:Encore une fois, nous pouvons voir une certaine similitude entre
nats
etnatsBuilder
. Il est très similaire à la connexion que nous avons observé avec reductors et des plis plus tôt.nats
est un anamorphism pournatsBuilder
.Un autre exemple, une fonction qui prend une valeur et une fonction et renvoie un flux d'applications successives de la fonction de la valeur:
Son générateur de fonction est la suivante:
Puis
iterate
est un anamorphism pouriterateBuilder
.Conclusion
Donc, en résumé, F-algèbres de permettre de définir des plis, qui est, les opérations qui réduisent la structure récursive) en une valeur unique, et F-coalgebras permettre de faire le contraire: la construction d'un [potentiellement] infini de la structure à partir d'une seule valeur.
En fait en Haskell F-algèbres et F-coalgebras coïncident. C'est une très belle propriété qui est une conséquence de la présence de 'bas' de la valeur de chaque type. Donc en Haskell à la fois plie et déplie peut être créé pour chaque type récursif. Toutefois, le modèle théorique derrière c'est plus complexe que celui que j'ai présenté ci-dessus, j'ai donc délibérément l'ont évité.
Espère que cette aide.
appendReductor
semble un peu étrange et n'a pas vraiment m'aider à voir le modèle là... 🙂 Pouvez-vous vérifier que c'est correct?.. Ce qui devrait réducteur de types ressemblent en général? Dans la définition der
il, estF1
déterminé par le IntList, ou est-il un arbitraire de F?Passer par le tutoriel papier Un tutoriel sur la (co)algèbres et (co)induction devrait vous donner un aperçu de la co-algèbre dans l'informatique.
Ci-dessous est une citation de lui pour vous en convaincre,
Prélude, à propos de Catégorie de la théorie.
Catégorie de la théorie, doit être renommer la théorie des foncteurs.
Comme les catégories sont ce que l'on doit définir dans le but de définir les foncteurs.
(D'ailleurs, les foncteurs sont ce que l'on doit définir dans le but de définir les transformations naturelles.)
Ce qui est un foncteur?
C'est une transformation à partir d'un ensemble à un autre, la préservation de leur structure.
(Pour plus de détails il y a beaucoup de bonne description sur le net).
Ce qu'est une F-algèbre?
C'est l'algèbre de foncteur.
C'est juste l'étude de l'universel, de la bienséance de foncteur.
Comment peut-il être le lien à l'informatique ?
Le programme peut être vue comme un ensemble structuré d'informations.
Déroulement du programme correspondent à la modification de cet ensemble structuré d'informations.
Il sonne bien, que l'exécution doit préserver la structure du programme.
L'exécution peut être vue comme l'application d'un foncteur sur cet ensemble d'informations.
(Celui de la définition du programme).
Pourquoi F-co-algèbre ?
Programme double, par essence, comme ils sont de décrire l'information et de la ils agissent sur elle.
Puis principalement les informations qui composent le programme et les faire changé peut être vue dans les deux sens.
Puis, à ce stade, je tiens à dire que,
Au cours de la vie d'un programme, les données et l'état de co-existent, et ils se complètent.
Elles sont à double.
Je vais commencer avec des choses est évidemment relatives à la programmation, puis ajouter un peu plus de mathématiques choses, de les tenir en béton et terre-à-terre que je le peux.
Nous allons citer quelques-ordinateur-scientifiques sur la coinduction...
http://www.cs.umd.edu/~micinski/posts/2012-09-04-on-understanding-coinduction.html
http://adam.chlipala.net/cpdt/html/Coinductive.html
http://www.alexandrasilva.org/#/talks.html
Concernant la ambiantes contexte mathématique habituelle des tâches de programmation
Qu'est-ce que l'algèbre"?
Structures algébriques généralement l'apparence d':
Cela devrait sonner comme des objets avec 1. propriétés et 2. des méthodes. Ou encore mieux, il devrait ressembler à type de signatures.
Mathématique Standard exemples incluent monoïde ⊃ groupe ⊃ espace vectoriel ⊃ "algèbre". Monoids sont comme des automates: les séquences de verbes (par exemple,
f.g.h.h.nothing.f.g.f
). Ungit
journal qui ajoute toujours de l'histoire et ne supprime jamais ce serait un monoïde, mais pas un groupe. Si vous ajoutez inverses (par exemple, les nombres négatifs, les fractions, les racines, la suppression du cumul de l'histoire, de l'onu-brisant un miroir brisé), vous obtenez un groupe.Groupes contiennent des choses qui peut être ajouté ou soustrait ensemble. Par exemple
Duration
s peut être ajouté. (MaisDate
s ne peut pas.) Les durées de vivre dans un espace vectoriel (et pas seulement un groupe), car ils peuvent aussi être mis à l'échelle par l'extérieur les numéros de. (Une signature de type descaling :: (Number,Duration) → Duration
.)Algèbres ⊂ vecteur-espaces peuvent faire encore une autre chose: il y a quelques
m :: (T,T) → T
. Appeler cela une "multiplication" ou ne l'est pas, car une fois que vous quittezIntegers
c'est moins évident que "multiplication" (ou "exponentiation") devrait être.(Ce est pourquoi les gens se tournent vers (catégorie de la théorie) les propriétés universelles: pour leur dire ce que la multiplication devraient ne ou être comme:
)
Algèbres → Coalgebras
Comultiplication est plus facile de définir d'une manière qui se sent non-arbitraire, que la multiplication, parce que pour aller de
T → (T,T)
vous pouvez simplement répéter le même élément. ("de diagonale carte" – comme la diagonale des matrices/opérateurs de théorie spectrale)Counit est généralement la trace (la somme de la diagonale d'entrées), mais encore une fois ce qui est important est ce que votre counit ne;
trace
est juste une bonne réponse pour les matrices.La raison de regarder un double espace, en général, c'est parce qu'il est plus facile de penser dans l'espace. Par exemple, il est parfois plus facile de penser à un vecteur normal que l'avion c'est normal, mais vous pouvez contrôler les avions (y compris les hyperplans) avec des vecteurs (et maintenant, je parle de l'familier géométrique, vecteur, comme dans un ray-traceur).
Apprivoiser (onu)données structurées
Mathématiciens pourraient être modélisation de quelque chose d'amusant comme TQFT de l', tandis que les programmeurs ont à se débattre avec
+ :: (Date,Duration) → Date
),Paris
≠(+48.8567,+2.3508)
! C'est une forme, non pas d'un point.),Scientifiques de l'informatique, quand on parle de coalgebras, ont généralement des set-ish opérations à l'esprit, comme le produit Cartésien. Je crois que c'est ce que les gens veulent dire quand ils disent que "les Algèbres sont coalgebras en Haskell". Mais dans la mesure où les programmeurs ont pour modèle de données complexes-des types comme
Place
,Date/Time
, etCustomer
et de faire de ces modèles ressembler un peu comme le monde réel (ou au moins la fin de l'utilisateur, une vue du monde réel) que possible—je crois duaux, pourrait être utile au-delà des seuls ensemble de la planète.