Tengo un conjunto de funciones que funcionan en vectores, es decir listas con longitudes de tipo obligatorio.Declarando instancias de sinónimos de tipo parametrizado
que estoy tratando de hacer mis tipos más fáciles de escribir, es decir, en lugar de escribir
foo :: (Fold Integer v, Map Integer Integer v v, ...) => ...
Estoy declarando una nueva clase NList
así que sólo puedo escribir foo :: NList v Integer => ...
El (simplificado) Clase se parece a esto:
class (Fold (v i) i
, Map i i (v i) (v i)
, Map i (Maybe i) (v i) (v (Maybe i))
) => NList v i
como se puede ver, tengo que mantener el tipo "vector" separado del tipo "punto" (es decir v
separado de i
) para que pueda hacer cosas como Map
en un vector Maybe
.
Como tal, debe tener v
tipo * -> *
, y i
tipo *
.
Sin embargo, cuando intento crear una instancia con vectores de esta manera:
instance NList Vec2 Integer
instance NList Vec3 Integer
...
me sale el siguiente error:
Type synonym `Vec2' should have 1 argument, but has been given none
In the instance declaration for `NList Vec2 Integer'
Ahora, soy muy nuevo para escribir a nivel de programación, y entiendo que probablemente estoy haciendo esto de una manera muy atrasada. ¿Es posible instanciar un sinónimo de tipo como este? ¿Algún tipo de asistentes tiene sugerencias para mejores formas de lograr mis objetivos?
Muy bueno, gracias. Lo único que no entiendo es el último ejemplo. ¿Qué pasa con el operador tilda? – So8res
Es una [restricción de igualdad] (http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/equality-constraints.html). Si tiene una restricción 'Num a' en el alcance, puede usar operadores aritméticos en valores de tipo' a'; si tiene una restricción '(a ~ b)' en el alcance, puede usar valores 'a' como valores' b' y viceversa. Básicamente, puedes leer '(n ~ Z) => r' como" demostrarme que 'n' es' Z', y te daré una 'r'". – ehird