J'essaie d'utiliser la bibliothèque linéaire d'ekmett, et j'ai quelques problèmes avec les vecteurs de longueur variable, dans Linear.V. Comment puis-je utiliser la fonction dim
pour obtenir la taille d'un vecteur? Comment puis-je utiliser trace
sur une grande matrice carrée faite de V
s imbriqués? J'ai des erreurs dans ces deux cas.Comment utiliser des vecteurs de taille variable dans la bibliothèque "Linear" d'Edward Kmett?
Code minimal:
import qualified Data.Vector as Vector
import Linear.V (V(V), dim)
import Linear.Vector (outer)
import Linear.Matrix (trace)
v, w :: V n Double -- What do I do here?
v = V $ Vector.fromList [1..5]
w = V $ Vector.fromList [2, 3, 5, 7, 11]
d = dim v
m = outer v w
t = trace m
Il donne à ces erreurs que je ne comprends pas:
• Ambiguous type variable ‘n0’ arising from a use of ‘dim’
prevents the constraint ‘(Linear.V.Dim n0)’ from being solved.
Probable fix: use a type annotation to specify what ‘n0’ should be.
These potential instances exist:
two instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In the expression: dim v
In an equation for ‘d’: d = dim v
• Ambiguous type variable ‘n1’ arising from a use of ‘trace’
prevents the constraint ‘(Linear.V.Dim n1)’ from being solved.
Probable fix: use a type annotation to specify what ‘n1’ should be.
These potential instances exist:
two instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In the expression: trace m
In an equation for ‘t’: t = trace m
Vous ne devriez pas utiliser le constructeur 'V' directement, car vous pouvez facilement violer l'invariant que la longueur du vecteur et l'index de niveau de type indiquant la longueur ne correspondent pas. Utilisez 'Linear.V.fromVector (fromList [1 ..5]) :: V 5 Double' - notez que si vous spécifiez la mauvaise longueur au niveau du type, alors cette fonction vous donne 'Nothing', et avec ce type' dim' sera capable de satisfaire le 'Dim n' ("Dim 5" dans ce cas) contrainte. Si vous voulez réellement le type 'existe la longueur. V longueur X' alors ce type est précisément 'Vector X'. – user2407038
Hmm. @ user2407038 a raison, mais il y a quelque chose de louche dans 'trace' - pour une raison inconnue, je n'arrive pas à convaincre GHC que la contrainte' Trace' est satisfaite ... – Alec