Quiero crear varios tipos de datos incompatibles, pero por lo demás iguales. Es decir, me gustaría tener un tipo parametrizado Foo a
, y funciones tales como¿Estoy pensando y usando tipos de singleton en Haskell correctamente?
bar :: (Foo a) -> (Foo a) -> (Foo a)
sin encargada del cuidado acerca de lo que es a
. Para aclarar aún más, me gustaría que el sistema de tipos para que dejara de hacer
x :: Foo Int
y :: Foo Char
bar x y
mientras que al mismo tiempo no me importa acerca Int
y Char
(que sólo se preocupan de que no son lo mismo) .
En mi código actual tengo un tipo para polinomios sobre un anillo dado. En realidad, no me importa lo indeterminado, siempre que el sistema de tipo me impida agregar un polinomio en t con un polinomio en s. Hasta ahora he resuelto mediante la creación de una clase de tipos Indeterminate
, y parametrización mi tipo polinomio como
data (Ring a, Indeterminate b) => Polynomial a b
Este enfoque se siente perfectamente natural para la parte Ring
porque yo hago cuidado sobre dicho anillo particular un polinomio dado ha terminado . Se siente muy artificial para la pieza Indeterminate
, como se detalla a continuación.
El enfoque anterior funciona bien, pero se siente artificial. Especialmente por lo que esta parte:
class Indeterminate a where
indeterminate :: a
data T = T
instance Indeterminate T where
indeterminate = T
data S = S
instance Indeterminate S where
indeterminate = S
(y así sucesivamente para tal vez un poco más indeterminado). Se siente raro e incorrecto. Básicamente, estoy tratando de exigir que las instancias de Indeterminate
sean singletons (en this sense). La sensación de rareza es un indicador de que podría estar atacando esto erróneamente. Otro es el hecho de que termino teniendo que anotar muchos de mis Polynomial a b
s ya que el tipo real b
a menudo no se puede inferir (eso no es extraño, pero es molesto, sin embargo).
¿Alguna sugerencia? ¿Debo seguir haciéndolo así o me estoy perdiendo algo?
PD: No se ofenda si no voto de más ni acepto respuestas de inmediato. No podré volver a consultar durante unos días.
¿Hay una buena razón para no modelar polinomios como secuencias de elementos del anillo o algo similar (secuencias de sumas parciales, por ejemplo)? –
Ok, estoy un poco perdido aquí. No entiendo por qué necesitas 'Indeterminado' en absoluto. Si solo quiere hacer cumplir que dos bs son iguales, déjelo en la firma de tipo, ¿y eso es todo? – sclv
@Alexandre C .: Estoy haciendo eso. Pero me gustaría que la firma del tipo no tenga sentido, digamos, agregar "2 + 5t" a "6s". Con polinomios como secuencias de elementos de anillo, el sistema de tipos (con razón) me impide agregar un polinomio con coeficientes en un anillo con uno con coeficientes en otro, pero no se distingue en indeterminados. Ahora, por supuesto, si realmente necesito o no indeterminado es una pregunta muy válida :-) – gspr