Giter VIP home page Giter VIP logo

agda-categories's Introduction

agda-categories's People

Contributors

4e554c4c avatar 91khr avatar balacij avatar boarders avatar bolt12 avatar conal avatar cxandru avatar dependabot[bot] avatar dreamlinuxer avatar gallais avatar hustmphrrr avatar iblech avatar iwilare avatar jacquescarette avatar jdemler avatar jmarkakis avatar jpoiret avatar lamudri avatar matthewdaggitt avatar maxsnew avatar o-da avatar rei1024 avatar reijix avatar sergey-goncharov avatar sstucki avatar taneb avatar totbwf avatar trebor-huang avatar xplat avatar yourboynico avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

agda-categories's Issues

distinguish predicates and properties

as @sstucki pointed out, there are predicates having the names of properties. this is ultimately due to the old library. on the other hand, we want to keep the style of this library as close to stdlib as possible, so it does make sense to define X and IsX separately.

missing axiom from Braided Monoidal Category definition?

field
hexagon₁ : [ (X ⊗₀ Y) ⊗₀ Z ⇒ Y ⊗₀ Z ⊗₀ X ]⟨
B ⊗₁ id ⇒⟨ (Y ⊗₀ X) ⊗₀ Z ⟩
associator.from ⇒⟨ Y ⊗₀ X ⊗₀ Z ⟩
id ⊗₁ B
≈ associator.from ⇒⟨ X ⊗₀ Y ⊗₀ Z ⟩
B ⇒⟨ (Y ⊗₀ Z) ⊗₀ X ⟩
associator.from
hexagon₂ : [ X ⊗₀ Y ⊗₀ Z ⇒ (Z ⊗₀ X) ⊗₀ Y ]⟨
id ⊗₁ B ⇒⟨ X ⊗₀ Z ⊗₀ Y ⟩
associator.to ⇒⟨ (X ⊗₀ Z) ⊗₀ Y ⟩
B ⊗₁ id
≈ associator.to ⇒⟨ (X ⊗₀ Y) ⊗₀ Z ⟩
B ⇒⟨ Z ⊗₀ X ⊗₀ Y ⟩
associator.to

I believe the definition of a braided category should also include the small axiom:

    triangle : [ X ⊗₀ unit ⇒ X ]⟨
                 B                            ⇒⟨ unit ⊗₀ X ⟩
                 unitorˡ.from
               ≈ unitorʳ.from
               ⟩

Cats is CartesianClosed (when all levels the same)

I tried to prove this, got a fair ways in, and got stuck. I don't think it is fundamental, just that I'm missing something that will likely turn out to be simple. Also, my definitions might be off a bit, which certainly wouldn't help matters.
I've pushed my attempts onto branch 'CatsCCC' (as I can't attach .agda files easily here). Holes 3 and 5 in particular. I think the rest are ok, just tedious.

is the equivalence of Grothendieck construction correct?

the equivalence of Grothendieck construction looks strange to me.

consider the following diagram:

IMG_20190907_164246

the current definition only has f and g equivalent, but I suppose the triangle in category FB does not necessarily commute, does it?

ensure names reflect the kinds of properties

I noticed that there are names in some definitions that are not quite reasonable.

For example, https://github.com/agda/agda-categories/blob/master/Categories/Object/Product/Core.agda

    commute₁  : π₁ ∘ ⟨ h , i ⟩ ≈ h
    commute₂  : π₂ ∘ ⟨ h , i ⟩ ≈ i
    universal : π₁ ∘ h ≈ i  π₂ ∘ h ≈ j  ⟨ i , j ⟩ ≈ h

here universal shouldn't be universal, but unique, because it reflects the uniqueness of product. rather, commutes are universality.

probably the names should be reviewed to achieve consistency.

Code review of existing code

I should acquaint myself with all the current code that @HuStmpHrrr has written.

  • Category.Core
  • Category.SubCategory
  • Category
  • Category.Discrete
  • Square.Core
  • Morphism
  • Category.Groupoid
  • Square.Iso
  • Square
  • Functor.Core
  • Functor
  • Category.Slice
  • Object.Product.Core
  • Object.Product.Morphisms
  • Diagram.Equalizer
  • Category.Morphisms
  • Morphism.Properties
  • Morphism.Isomorphism
  • Functor.Properties
  • Object.Product
  • Object.Terminal
  • Object.Initial
  • Object.BinaryProducts
  • Diagram.Cone
  • Diagram.Limit
  • Diagram.Pullback
  • Object.Coproduct
  • Object.Exponential
  • NaturalTransformation.Core
  • NaturalTransformation
  • NaturalTransformation.NaturalIsomorphism
  • Monad
  • Category.Cats
  • Category.Product
  • Functor.Bifunctor
  • Category.Sets
  • Functor.Hom
  • Category.Functors
  • Category.Monoidal
  • Category.Monoidal.Properties
  • Functor.Power
  • Adjoint

`Instance.X.Properties` instead of many `Instance`

I am tempted to show Cats has all exponentials, which makes Cats a cartesian closed category. the problem is that the proof of cartesian closed category is in Monoidal, and where should cartesian closed category lives. I figure that probably Category.Instance.Cats.Properties is a better place to fit all these properties and is a single place to find the properties of Cats. Sets, Setoids have a similar situation.

Decide when to do a release

I think the library is close to being in a state to be officially released. I think #23 should be fixed first, just so that it works with a currently-released library. What other issues should be closed before a release?

I might wish to call the release 0.1. There's still lots to do, but it is quite usable as is.

Where to organize the 'with K' part of the categories library?

As discussion on various issues make clear (#44 being just the latest), it would be quite useful to have parts of the library, especially that part which makes strong use of such as StrictCats, also be able to use the K axiom. But the whole library is currently built using --without-K` (on purpose).

So this leads to a non-trivial organization question. For example, should there be a WithK hierarchy right below Categories (or even parallel to it?) for that? Or should they be intertwined, the way it is for stdlib? I see pros and cons to both, and am undecided which I prefer.

Agda error when trying to load Everything.agda

agda-categories/Categories/Category/Instance/Properties/Setoids.agda:81,22-28
Ambiguous name Cocone. It could refer to any one of
  Categories.Diagram.Cocone.Cocone bound at
    agda-categories/Categories/Diagram/Cocone.agda:20,8-14
  Categories.Category.Construction.Cocones.Cocone bound at
    agda-categories/Categories/Diagram/Cocone.agda:20,8-14

Challenge: prove that the Discrete functor is the (cartesian) left-adjoint of the forgetful functor from Cats to Sets

Categories currently don't carry an explicit notion of equality on objects. This seems to be a "standard" way to mechanize categories constructively (as far as I'm aware), it is in line with the principle of equivalence, and it also simplifies the definition of Category greatly.

However, I'm worried that some rather elementary category theory silently assumes that objects really do have an equality (despite all the talk about this being evil). For example, one may define things like the hom-functor Hom : Cᵒᵖ × C → Sets from some category C to the category of sets. But in a constructive setting, we surely want to remember the notion of equality on morphisms in C so it's more accurate to type this as Hom : Cᵒᵖ × C → Setoids. (And this is indeed what seems to be implemented in Categories.Functor.Hom).

Another example is the adjunction between the forgetful functor from Cats to Sets and the Discrete functor in the opposite direction. In text-book category theory, both Cats and Sets are CCCs, so this adjunction should consist of a pair of cartesian functors. Following a short discussion with @JacquesCarette on Twitter, I have tried to mechanize this IMO very elementary result, but have failed so far. Here's a summary of what I've tried so far:

  • Show that Sets is cartesian closed — this fails because it seems to require function extensionality (at least as Sets is currently defined).
  • Use Setoids, which is a CCC, instead of Sets. Now we need to pick a notion of equality on objects as we go from Cats to Setoids.
    • Use isomorphism (don't be evil) — this isn't truly forgetful but results in a truncation because we are effectively quotienting objects by isomorphism. There is no left-adjoint because truncation forgets equality proofs of morphisms, which are required to define the counit.
    • Use propositional equality (be truly forgetful) — there is again no left-adjoint because the unit would have to (propositionally) identify setoid elements that are only equivalent.

There might be other options, but ultimately I think that if one wanted to mechanize a "classic" text-book on category theory, one would be forced to use a more "evil" notion of constructive categories, such as Palmgren's H-categories. I don't think that's too bad though. I see no reason that the two notions of categories could coexist in the same library, in principle.

2-Category is in fact Bicategory

I was looking at Bicategory and realized that what is defined as 2-Category is in fact bicategory, as their difference is merely that in 2-Category equivalence between 1-cells is strict equality while in Bicategory such equivalence becomes natural isomorphism. the current definition of 2-Category lies in the later definition. I propose let's make it clear and rename it to Bicategory.

it appears that in order to define 2-Category in the sense of traditional CT, it requires to express strict categories and comparison for strict equality of functors, and that probably requires K.

memory limit is hit

I think type check now requires more memory.

 Checking Categories.Category.Instance.Zero (/home/hu/projects/agda-categories/Categories/Category/Instance/Zero.agda).
  Checking Categories.Category.Monoidal.Properties (/home/hu/projects/agda-categories/Categories/Category/Monoidal/Properties.agda).
 Checking Categories.Category.Monoidal.Closed.IsClosed (/home/hu/projects/agda-categories/Categories/Category/Monoidal/Closed/IsClosed.agda).
agda: Heap exhausted;
agda: Current maximum heap size is 5368709120 bytes (5120 MB).
agda: Use `+RTS -M<size>' to increase it.
Makefile:6: recipe for target 'test' failed
make: *** [test] Error 251

there is definitely something can be done on Agda's side.

Shouldn't _≅_ be in Object?

Right now, it is defined in Morphism, but it is really about two objects being isomorphic. Defining Epi and Mono in Morphism makes sense.

consider disabling eta expansion of records

it appears that all concepts defined by records have eta expansion. the problem I suppose to have is that, with eta expansion, type unification can get very slow because it requires to unify more holes than the case without eta expansion. is it worth trying to disable eta expansion of all records? I hope this does not break anything because in the proof relevant context, if Agda figures out two records are unified, the chances are they are the same record.

Which is the 'true' Zero category?

Consider the following:

  Zero′ : Category o ℓ e
  Zero′ = record
    { Obj = Lift o ⊥
    ; _⇒_ = λ _ _  Lift ℓ ⊤
    ; _≈_ = λ _ _  Lift e ⊤
    ; id = lift tt
    ; _∘_ = λ _ _  lift tt
    }

  Zero′-⊥ : Initial
  Zero′-⊥ = record
    { ⊥ = Zero′
    ; ! = record
      { F₀ = λ { (lift x)  ⊥-elim x }
      ; F₁ = λ { {A = lift () } }
      ; identity = λ { {A = lift () } }
      ; homomorphism = λ { {()} }
      ; F-resp-≈ = λ { {()} }
      }
    ; !-unique = λ f  record
      { F⇒G = record { η = λ {()} ; commute = λ { {()} } }
      ; F⇐G = record { η = λ {()} ; commute = λ { {()} } }
      ; iso = λ ()
      }
    }

which shows that Agda is just as happy with this definition of 'the' initial object of Cats. This feels vaguely suspicious. What am I missing?

A list of modules to port

Consider porting all of the following:

  • 2-Category.agda
  • 2-Category/Categories.agda
  • Adjunction.agda
  • Adjunction/Composition.agda
  • Adjunction/CompositionLaws.agda
  • Agda.agda
  • Agda/ISetoids/Cocomplete.agda
  • Agda/ISetoids/Cocomplete/Helpers.agda
  • Agda/ISetoids/Complete.agda
  • Arrow.agda
  • Bicategory.agda
  • Bicategory/Helpers.agda
  • Bigroupoid.agda
  • Categories.agda
  • Categories/Products.agda
  • CategorySolver.agda
  • Closed.agda
  • Cocone.agda
  • Cocones.agda
  • Coend.agda
  • Coequalizer.agda
  • Colimit.agda
  • Comma.agda
  • Comma/Functors.agda
  • Comonad/Cofree.agda
  • Congruence.agda
  • Coproduct.agda
  • DinaturalTransformation.agda
  • End.agda
  • Enriched.agda
  • Equalizer.agda
  • Equivalence/Strong.agda
  • Fam.agda
  • Fibration.agda
  • Free.agda
  • Functor/Algebras.agda
  • FunctorCategory.agda
  • Functor/Coalgebras.agda
  • Functor/Constant.agda
  • Functor/Diagonal.agda
  • Functor/Discrete.agda
  • Functor/Equivalence/Strong.agda
  • Functor/Monoidal.agda
  • Functor/Product.agda
  • Functor/Representable.agda
  • Globe.agda
  • GlobularSet.agda
  • Graphs.agda
  • Graphs/Underlying.agda
  • Grothendieck.agda
  • Groupoid/Coproduct.agda
  • Groupoid/Product.agda
  • Lift.agda
  • Limit.agda
  • Monad/Algebra.agda
  • Monad/Algebras.agda
  • Monad/Coproduct.agda
  • Monad/EilenbergMoore.agda
  • Monad/Kleisli.agda
  • Monad/Strong.agda
  • Monoidal.agda
  • Monoidal/Braided.agda
  • Monoidal/Braided/Helpers.agda
  • Monoidal/Cartesian.agda
  • Monoidal/CartesianClosed.agda
  • Monoidal/Cartesian/Pentagon.agda
  • Monoidal/Closed.agda
  • Monoidal/Helpers.agda
  • Monoidal/IntConstruction.agda
  • Monoidal/Symmetric.agda
  • Monoidal/Traced.agda
  • Morphism/Cartesian.agda
  • Morphism/Indexed.agda
  • NaturalIsomorphism.agda
  • NaturalTransformation.agda
  • Normalise.agda
  • Object/BinaryCoproducts.agda
  • Object/BinaryProducts/Abstract.agda
  • Object/BinaryProducts.agda
  • Object/BinaryProducts/N-ary.agda
  • Object/Coproduct.agda
  • Object/Coproducts.agda
  • Object/Exponential.agda
  • Object/Exponentiating/Adjunction.agda
  • Object/Exponentiating.agda
  • Object/Exponentiating/Functor.agda
  • Object/Indexed.agda
  • Object/IndexedProduct.agda
  • Object/IndexedProducts.agda
  • Object/Initial.agda
  • Object/Product.agda
  • Object/Product/Morphisms.agda
  • Object/Products.agda
  • Object/Products/N-ary.agda
  • Object/Products/Properties.agda
  • Object/SubobjectClassifier.agda
  • Object/Terminal.agda
  • Object/Terminal/Exponentials.agda
  • Object/Terminal/Exponentiating.agda
  • Object/Terminal/Products.agda
  • Object/Zero.agda
  • Opposite.agda
  • Power.agda
  • Power/Functorial.agda
  • Power/NaturalTransformation.agda
  • Preorder.agda
  • Presheaf.agda
  • Presheaves.agda
  • Product/Projections.agda
  • Product/Properties.agda
  • Profunctor.agda
  • Pushout.agda
  • RigCategory.agda
  • Square.agda
  • SubCategory.agda
  • Terminal.agda
  • Topos.agda
  • WithFamilies.agda
  • Bifunctor.agda
  • Category.agda
  • Comonad.agda
  • Cone.agda
  • Cones.agda
  • Discrete.agda
  • Functor.agda
  • Functor/Algebra.agda
  • Functor/Coalgebra.agda
  • Functor/Core.agda
  • Functor/Hom.agda
  • Functor/Properties.agda
  • Groupoid.agda
  • Lan.agda and Ran.agda
  • Monad.agda
  • Morphisms.agda
  • NaturalTransformation/Core.agda
  • Product.agda
  • Pullback.agda
  • Slice.agda
  • Yoneda.agda

copatterns or records?

@andreasabel said (at 2d81933#r34263025) :

For the new categories library, did you consider using copattern matching instead of records? What is the policy for chosing one over the other?

Definition by copattern is more lazy, which might have a positive effect on the performance of Agda type-checking. Did you make some experiments?

I personally have not yet used copatterns in any code, so to use them right from the start of this library would have been a big jump. But I have been wanting to experiment with that in some of my code for Pi (the reversible programming language) and RigCategories, where this lazyness might be quite beneficial.

Having said that, as a user of the library, I definitely count on a lot of beta-reduction to happen (at least under C-u C-u C-c C-. ) to 'specialize' from general categorical stuff to the situation I am working in. Even in the categorical context, getting things like Categories/Functor/Instance/Discrete.agda to work. So really understanding exactly the lazyness of copatterns is very important.

As to the deepest question: is there a settled policy on record/copattern? I would say that there is not. I happen to like records - they match my mental picture of how this information should be captured. But I am definitely willing to be convinced. [Can't speak for @HuStmpHrrr ]

For example, the type-checking time of Categories/Category/Monoidal.agda and Categories/Category/Monoidal/Properties.agda is a bit sluggish. If judicious use of definitions by copatterns would help with that, that would be quite a valuable piece of information.

Strict Category Theory

Related to #35 .

So in branch Strict, I implemented a lot of Strict category theory, with a particular design in mind: That Category itself wouldn't be parametrized by an equality, but would use the surrounding propositional equality instead. Quite a lot of stuff can be defined. But eventually things "stop working". Here are some of them:

  • Functor equality. Using doesn't quite work, as Functor contains functions, and we don't have extensionality. One can definitely define
      _≡F_ :  {o ℓ} {o′ ℓ′} {C : Category o ℓ} {D : Category o′ ℓ′}  (F G : Functor C D)  Set (ℓ′ ⊔ ℓ ⊔ o ⊔ o′)
    (there are variations, the one in the code turns out to be sub-optimal). Of course, one problem with that definition is that it is exactly that: a definition. Which means that it isn't 'on the nose'. Now, it's quite close, and one would hope to be able to define an eliminator from that data into . Alas, as far as I can tell, that needs axiom K to work.
  • Things really start to break down in trying to provide examples / instances. Showing that (for instance) two Monoid Homomorphisms are is again really hard without extensionality and without proof irrelevance. In other words, one needs to assume that the carrier is a set (in the HoTT sense of the word). This isn't so weird for Monoid. But for Cats (the category of categories) things get worse, and brings us back to _≡F_ : since Functors are not nicely 'equal', one needs to instead use (weak) Category that allows us to give a _≡_ parameter. Then things do work (but the proofs are painful).
  • This of course infects other definitions, in particular 2-Category needs to use the weak definition of Enriched because the resulting Monoidal 2-Category Cats over which we enrich is weak.
  • But things are worse still as the Functors Category can't really even be written down! It is supposed to be a strict category, but proving associativity (etc) requires equality of Natural Transformations, whose equality is even more difficult to write down properly (η is a function whose rhs is dependently typed).

In other words, if the meta-theory is intensional, using propositional equality as a stand-in for "equality" for Strict categories just doesn't work. This is where CT seems to be very sensitive to its meta-theory, and its usual meta-theory is still haunted by set-theoretic, extensional thinking.

Monad

Toying with come copy of the old code, I finally encountered one problem: the definition of Monad doesn't go through without irrelevance, as least in the way it was defined in the old library. In particular, one gets the error

F₁ (Category.id C) != Category.id C of type
(C Category.⇒ F₀ (F₀ A)) (F₀ (F₀ A))
when checking that the expression μ ∘ʳ F has type
NaturalTransformation (F ∘F F ∘F F) (F ∘F F)

on the line

     assoc     : (μ ∘₁ (F ∘ˡ μ)) ≡T (μ ∘₁ (μ ∘ʳ F))

Those two are, of course, "equal", but not definitionally equal.

I am completely convinced that Heterogeneous equality is not the solution. A different definition of the associativity law is probably the way to go. One that does not require that definitional equality as an intermediate step.

Library design discussion

This is an issue for discussion about how the library should be design, from various aspects, including module structure and naming conventions. The overall principle should be to stay close with style guideline in standard library.

Module structure

I propose that the libary should contain the following top level modules:

  1. Object, which contains definitions of objects, e.g. initial and terminal objects, products, and exponentials.
  2. Morphism, which contains definitions of morphisms, e.g. epis and monos.
  3. Diagram, which contains definitions of diagram in a category, e.g. pullbacks and limits.
  4. Category, which contains definitions of various categories, e.g. monoidal category, bi-category and ccc.
  5. Functor, which contains definitions of various functors, e.g. hom functors, profunctors.
  6. NaturalTransformation, which contains definitions of natural transformations, e.g. natural isomorphisms.
  7. Adjoint, which contains definitions of adjoint functors, e.g. proadjoint.

I suppose there will be needs for other top level modules, e.g. Algebra, Coalgebra. We can add more once there is a need.

Naming

Naming conventions should comply with standard library. For example, module names are usually singular, with the exception of the top level module Categories and Properties.

For variables, I propose following conventions.

  1. A, B, C, D, X, Y, Z are for objects.
  2. f, g, h, i, a, b, c for morphisms.
  3. C, D, E are for categories. Clearly, the conventions for objects and categories collide. Sometimes it is not a problem, but when it does, I propose to use calligraphic letters 𝒞, 𝒟, ℰ, for categories. They can be input in emacs by \McC, \McD, \McE.
  4. F, G, H, I for functors.
  5. α, β, γ, η for natural transformations.

When defining structures, I propose the names should match the idea of UMP. e.g. if it's a universality property, then it should be called universal; if it is a uniqueness property, then it should be called unique.

Other style problem.

  1. Use generalized variables whenever possible.
  2. Avoid unnecessary parentheses.

Increase the precedence of _⟩∘⟨refl over refl⟩∘⟨_

infixl 4 _⟩∘⟨refl

I believe _⟩∘⟨refl should have a different precedence than _⟩∘⟨_ and refl⟩∘⟨_ as I had some issues with agda struggling to parse expressions like ⟨ refl⟩∘⟨ something ⟩∘⟨refl ⟩ and since we want right associativity, _⟩∘⟨refl should have the higher precedence so I would propose changing it to a 5. For me, doing this little change made the quoted expression work in the end.
What do you think?

Conclusions using K

In the original library, there are many conclusions which make use of K. The same as stdlib, we can also have WithK submodules for those conclusions.

`id-comm` is odd

id-comm is defined in Categories.Category.Core as a definitional extension to a Category record.

Is that really where it belongs? It seems really out of place. Feels like it ought to be in Categories.Morphism, for example.

Also, almost all uses are actually of the 'other' version, so the code has a lot of Equiv.sym id-comm (in various guises) strewn around. That is quite ugly, so I think that ought to have its own name. But I reluctant to add it to the Category record.

Function does not accept argument {i = _}

Hi!
I just cloned and tried to load your library but I get the error:

.../agda-categories/Categories/Morphism/Isomorphism.agda:181,41-51
Function does not accept argument {i = _}
when checking that {i = _ ∼⁺⟨ [ f ] ⟩ [ g ]} {j = [ h ]} eq are
valid arguments to a function of type
{A B : Obj} → ≅⁺⇒⇒⁺ Preserves ≃⁺≈⁺

Any idea why that might be and what I can do to make the library loadable?
Thank you!

Modularize and clean up Categories.Category.Construction.Graphs

The module Categories.Category.Construction.Graphs should be refactored.

The module currently contains
* basic definitions (graphs and their morphisms),
* the definition of the category of graphs,
* the functor mapping graphs to their free categories,
* an adjunction between the forgetful functor and the free functor,
* various helper/utility constructs and lemmas (e.g. path equality, etc.).

These should probably all go in separate modules. Some of the code should be moved to the standard library.

(See comments in the code for more details.)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.