Ich möchte einen Typ haben, der mehrdimensionale Arrays (Tensoren) typsicher darstellt. so konnte ich zum Beispiel schreiben: zero :: Tensor (5,3,2) Integer
, die ein mehrdimensionales Array darstellen würde, die 5-Element hat, von denen jeder hat drei Elemente, von denen jedes zwei Elemente aufweisen, wobei alle Elemente sind Integer
sTyp-Level-Programmierung zur Darstellung mehrdimensionaler Arrays (Tensoren)
Wie würden Sie definieren diese Art verwenden Typ-Level-Programmierung?
bearbeiten:
Nach der wunderbaren Antwort von Alec, der diese mit GADT
s umgesetzt,
Ich frage mich, ob Sie noch einen Schritt weiter, nehmen und mehrere Implementierungen eines class Tensor
und der Unterstützung die Operationen auf Tensoren und Serialisierung von Tensoren
, so dass Sie zum Beispiel haben könnte:
GPU
oderCPU
ImplementierungenC
- reine
Haskell
Implementierungen - Implementierung verwenden, die nur die grafische Darstellung der Berechnung druckt und berechnen nichts
- Implementierung, die Ergebnisse auf der Festplatte Berechnung
- etc
- parallel oder verteilten Caches ...
Alle Typen sicher und einfach zu bedienen.
Meine Absicht ist es, eine Bibliothek in Haskell viel wie tensor-flow
aber typsicher und vieles mehr erweiterbar zu machen, mit automatic differentiation (ad library) und exact real arithmetic (exact-real library)
Ich denke, eine funktionale Sprache wie Haskell
viel mehr ist passend für diese Dinge (für alle Dinge meiner Meinung nach) als das Python-Ökosystem, das irgendwie keimte.
- Haskell ist rein funktional, viel mehr sutible für Computational Programmierung als Python
- Haskell viel effizienter als Python und kann auf binäre
- Haskells Faulheit (wohl) kompiliert werden, entfällt die Notwendigkeit, die Berechnung zu optimieren graph, macht und Code viel einfacher auf diese Weise
- viel mächtiger Abstraktionen in Haskell
Obwohl ich das Potenzial sehen, ich bin einfach nicht gut versiert genug (oder schlau genug) für diese Typ-Level-Programmierung, also weiß ich nicht, wie man so etwas in Haskell implementiert und es kompilieren lässt.
Dort brauche ich deine Hilfe.
Sie sehen können in [Data.FixedList] (https://hackage.haskell.org/package/ fixed-list-0.1.6/docs/Data-FixedList.html) Bibliothek um einen Typ zu definieren, der von Listen mit fester Länge abhängt. – Redu
Einige möglicherweise relevante Links: https://blog.jle.im/entry/practical-dependent-types-in-haskell-1.html https://blog.jle.im/entry/practical-dependent-types-in -haskell-2.html https://www.reddit.com/r/haskell/comments/67f4mw/napierian_tensors/ Auch das vektorgroße Paket http://hackage.haskell.org/package/vector-sized – danidiaz
Bitte auch schau dir Mike Izbickis Arbeit über den [Linear-Algebra-Teil von 'subhask'] (http://hackage.haskell.org/package/subhask-0.1.1.0/docs/SubHask-Algebra-Vector.html) an (er macht a viel maschinelles Lernen usw., also könnte dies relevant sein, wenn Sie in Richtung TensorFlow gehen wollen, und meine [linearmap-Kategorie] (http://hackage.haskell.org/package/linearmap-category-0.3. 2.0/docs/Math-LineareMap-Category.html # g: 5) (die Tensoren völlig agnostisch definiert und niemals über _dimensions_, sondern über _vector spaces_ spricht - diese können auch unendlich-dimensional sein). – leftaroundabout