Estoy luchando con tipos existenciales en mi programa. Creo que estoy tratando de hacer algo muy razonable, sin embargo yo no puedo pasar de la typechecker :(Escriba errores con tipos existenciales en Haskell
tengo un tipo de datos de este tipo imita una Mónada
data M o = R o | forall o1. B (o1 -> M o) (M o1)
Ahora crear un contexto para que, de forma similar al descrito en el Haskell Wiki article on Zipper, sin embargo utilizo una función en lugar de una estructura de datos para la simplicidad -
type C o1 o2 = M o1 -> M o2
ahora cuando trato de escribir una función que divide un valor de datos en su contexto y subvalue, la typechecker se queja -
ctx :: M o -> (M o1 -> M o, M o1)
ctx (B f m) = (B f, m) -- Doesn't typecheck
error es -
Couldn't match type `o2' with `o1'
`o2' is a rigid type variable bound by
a pattern with constructor
B :: forall o o1. (o1 -> M o) -> M o1 -> M o,
in an equation for `ctx'
at delme1.hs:6:6
`o1' is a rigid type variable bound by
the type signature for ctx :: M o -> (M o1 -> M o, M o1)
at delme1.hs:6:1
Expected type: M o2
Actual type: M o1
In the expression: m
In the expression: (B f, m)
Sin embargo, puedo trabajar alrededor de ella como tal -
ctx (B f m) = let (c,m') = ctx m in ((B f) . c, m') -- OK
¿Por qué este segundo typecheck definición, pero no el primero?
También, si lo intento de convertir ctx
a una función completa mediante la comprobación de R, I nuevamente sale un error typecheck -
ctx (R o) = (id, R o) -- Doesn't typecheck
Error -
Couldn't match type `o' with `o1'
`o' is a rigid type variable bound by
the type signature for ctx :: M o -> (M o1 -> M o, M o1)
at delme1.hs:7:1
`o1' is a rigid type variable bound by
the type signature for ctx :: M o -> (M o1 -> M o, M o1)
at delme1.hs:7:1
In the first argument of `R', namely `o'
In the expression: R o
In the expression: (id, R o)
¿Cómo puedo solucionar este ¿error?
¡Se agradece cualquier ayuda!
Gracias! Utilizar un tipo existencial en lugar de un Tuple funcionó muy bien, ¡y aprendí mucho en el proceso! –