Je voudrais avoir un type pour représenter les tableaux multidimensionnels (Tenseurs) de manière sécurisée. donc je pourrais écrire par exemple: zero :: Tensor (5,3,2) Integer
qui représenterait un tableau multidimensionnel qui a élément 5, dont chacun dispose de 3 éléments dont chacun ont 2 éléments, où tous les éléments sont Integer
sProgrammation au niveau du type pour représenter les tableaux multidimensionnels (Tenseurs)
Comment définiriez-vous ce type en utilisant programmation au niveau du type?
Modifier:
Après la merveilleuse réponse par Alec, qui mettait en œuvre ce en utilisant GADT
s,
Je me demande si vous pouviez prendre un peu plus loin et prendre en charge plusieurs implémentations d'un class Tensor
et les opérations sur tenseurs et sérialisation des tenseurs
telle que vous pourriez avoir par exemple:
GPU
ouCPU
implémentations utilisantC
- pures
Haskell
implémentations - application qui imprime uniquement le graphe de calcul et ne calcule rien
- mise en œuvre qui met en cache les résultats sur le disque
- de calcul parallèle ou distribué
- etc ...
Tous les types Sûr et facile à utiliser.
Mon intention est de faire une bibliothèque Haskell un peu comme tensor-flow
mais le type de sécurité et beaucoup plus extensible, en utilisant automatic differentiation (ad library) et exact real arithmetic (exact-real library)
Je pense un langage fonctionnel comme Haskell
est beaucoup plus approprié pour ces choses (pour toutes les choses à mon avis) que l'écosystème python qui a germé en quelque sorte.
- Haskell est purement fonctionnelle, beaucoup plus sutible pour la programmation informatique que python
- Haskell est beaucoup plus efficace que python et peut être compilé en binaire
- paresse de Haskell (sans doute) supprime la nécessité d'optimiser le calcul graphique et rend le code plus simple de cette façon
- abstractions beaucoup plus puissants dans Haskell
bien que je vois le potentiel, je ne suis pas assez bien versé (ou assez intelligent) pour cette programmation de niveau type, donc je ne sais pas comment implémenter une telle chose dans Haskell et la compiler.
C'est là que j'ai besoin de votre aide.
Vous pouvez regarder dans [Data.FixedList] (https://hackage.haskell.org/package/ fixed-list-0.1.6/docs/Data-FixedList.html) pour définir un type en fonction des listes de longueur fixe. – Redu
Quelques liens éventuellement pertinents: 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/naperian_tensors/ Aussi le paquet vectoriel http://hackage.haskell.org/package/vector-sized – danidiaz
S'il vous plaît aussi consultez le travail de Mike Izbicki sur la partie [algebra linéaire de 'subhask'] (http://hackage.haskell.org/package/subhask-0.1.1.0/docs/SubHask-Algebra-Vector.html) (il fait un beaucoup d'apprentissage automatique etc., donc cela peut être pertinent si vous voulez aller dans le sens de TensorFlow), et mon [linearmap-category] (http://hackage.haskell.org/package/linearmap-category-0.3. 2.0/docs/Math-LinearMap-Category.html # g: 5) (qui définit les tenseurs d'une manière complètement agnostique et ne parle jamais de dimensions, mais d'espaces de vecteurs), ceux-ci peuvent aussi être de dimension infinie). – leftaroundabout