Control.Monad.ST
nel pacchetto base
contiene runST
per eseguire il rigoroso dello stato-trasformatore monade:Questa generalizzazione di runST è sicura?
runST :: (forall s. ST s a) -> a
Tuttavia, ho bisogno di una versione generalizzata di runST
:
runSTCont :: (forall s . (forall b . ST s b -> b) -> a) -> a
runSTCont f = f $ \m -> runST $ unsafeCoerce m
La mia domanda è: questo uso di unsafeCoerse
sicuro? (Credo di sì, perché, come ho capito, l'unico scopo dell'indice s
è quello di impedire a trapelare s
valori -indexed nel risultato a
. Il tipo di runSTCont
non può fuoriuscire s
valori -indexed quindi dovrebbe essere OK.)
noti che runST
può essere espresso in termini di runSTCont
così runSTCont
è almeno altrettanto generale runST
:
runST' :: (forall s. ST s a) -> a
runST' m = runSTCont $ \runST -> runST m
Potresti aggiungere un caso d'uso, perché hai bisogno di 'ruNSTCont'? –
@ PetrPudlák, ho un caso d'uso complesso. Penso di poterlo semplificare, ma il caso d'uso più semplice è l'implementazione di 'runSTCont' stesso. Voglio evitare commenti come "questo caso d'uso potrebbe essere implementato anche con runST". –