Sono in difficoltà con tipi esistenziali nel mio programma. Penso che sto cercando di fare qualcosa di molto ragionevole comunque non posso andare oltre coontrollore dei tipo :(Errori di tipo con tipi Esistenziali in Haskell
Ho un tipo di dati che sorta di imita un Monade
data M o = R o | forall o1. B (o1 -> M o) (M o1)
Ora io a creare un contesto per esso, simile a quello descritto Haskell Wiki article on Zipper, tuttavia utilizzo una funzione invece di una struttura dati per semplicità -
type C o1 o2 = M o1 -> M o2
Ora quando provo a scrivere una funzione che divide un valore di dati nel suo contesto e subvalue, controllore dei tipi lamenta -
ctx :: M o -> (M o1 -> M o, M o1)
ctx (B f m) = (B f, m) -- Doesn't typecheck
errore è -
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)
Tuttavia, posso lavorare intorno ad esso in questo modo -
ctx (B f m) = let (c,m') = ctx m in ((B f) . c, m') -- OK
Perché questa seconda definizione TYPECHECK ma non il primo?
Inoltre, se cerco di convertire ctx
a una funzione completa controllando per R, ho di nuovo un errore di TYPECHECK -
ctx (R o) = (id, R o) -- Doesn't typecheck
Errore -
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)
Come posso ovviare a questo errore?
Qualsiasi aiuto è apprezzato!
Grazie! Usare un tipo esistenziale invece di una Tuple ha funzionato bene e ho imparato molto nel processo! –