Dadas las siguientes definiciones:Haskell rango dos polimorfismo error de compilación
import Control.Monad.ST
import Data.STRef
fourty_two = do
x <- newSTRef (42::Int)
readSTRef x
Los siguiente se compila bajo GHC:
main = (print . runST) fourty_two -- (1)
pero esto no significa:
main = (print . runST) $ fourty_two -- (2)
Pero entonces como bdonlan señala en un comentario, esto compila:
main = ((print . runST) $) fourty_two -- (3)
Pero, esto no compila
main = (($) (print . runST)) fourty_two -- (4)
lo que parece indicar que (3) sólo se compila debido al tratamiento especial de infija $
, sin embargo, todavía no explica por qué (1) compila
Preguntas:
1) He leído las siguientes dos preguntas (first, second), y he hecho creer $
solamente puede representarse con tipos monomorfas. Pero supondría de manera similar que .
solo se puede instanciar con tipos monomórficos y, como resultado, fallaría de manera similar. ¿Por qué el primer código tiene éxito pero el segundo código no? (por ejemplo, ¿existe una regla especial GHC para el primer caso que no se puede aplicar en el segundo?)
2) ¿Hay una extensión GHC actual que compila el segundo código? (Quizás ImpredicativePolymorphism hizo esto en algún momento, pero parece obsoleta, tiene todo lo reemplazó?)
3) ¿Hay alguna manera de definir decir `my_dollar`
el uso de extensiones de GHC para hacer lo $
hace, sino que también es capaz de manejar polimórfica tipos, entonces (print . runST) `my_dollar` fourty_two
compila?
Editar: Respuesta propuesta:
Además, la siguiente falla al compilar:
main = ((.) print runST) fourty_two -- (5)
Esto es lo mismo que (1), excepto que no se utiliza la versión infija de .
.
Como resultado, parece que GHC tiene reglas especiales para $
y .
, pero solo sus versiones de infijo.
para que sea aún más interesante, '((impresión runST) $.) fourty_two' _does_ trabajo – bdonlan
Eso es interesante y confunde las cosas aún más! – Clinton
Estoy bastante seguro de que hay una regla especial en GHC para admitir el caso 'runST $ do', pero no puedo encontrar una cita ahora. –