2011-08-30 15 views
6

Quizás estoy haciendo esto de la manera incorrecta, pero estoy usando HXT para leer algunos datos de vértice que me gustaría usar en una matriz en HOpenGL. Las matrices de vértices deben ser una Ptr que se crea llamando a newArray. Desafortunadamente newArray devuelve un IO Ptr, por lo que no estoy seguro de cómo usarlo dentro de una flecha. Creo que necesito algo con una declaración de tipo similar a IO a -> Arrow a?Llamar a una Monad de IO dentro de una Flecha

Respuesta

5

El tipo IO a -> Arrow a no tiene sentido; Arrow es una clase de tipo, no un tipo específico, muy similar a Monad o Num. Específicamente, una instancia de Arrow es un constructor de tipos que toma dos parámetros que describen cosas que se pueden componer como funciones, uniendo tipos de extremo a extremo. Entonces, la conversión de IO a a una flecha podría llamarse un error de tipo conceptual.

no estoy seguro exactamente lo que estamos tratando de hacer, pero si realmente quieres estar usando IO operaciones como parte de un Arrow, necesita la instancia Arrow incluir eso. La forma más sencilla de eso es observar que las funciones con tipos como a -> m b para cualquier instancia Monad se pueden componer de la manera obvia. El paquete hxt parece proporcionar un tipo más complicado:

newtype IOSLA s a b = IOSLA { runIOSLA :: s -> a -> IO (s, [b]) } 

Ésta es una cierta mezcla de los IO, State, y [] mónadas, unido a una función que por encima de tal manera que se puede componerlos pasando por los tres Monad s en cada paso. Realmente no he usado hxt mucho, pero si estos son los Arrow s con los que está trabajando, es bastante simple levantar una función arbitraria IO para que funcione como uno solo, simplemente pase el valor de estado s sin cambios, y gire la salida de la función en una lista singleton. Puede que ya exista una función para hacer esto por usted, pero no vi ninguna en un breve vistazo.

Básicamente, te gustaría algo como esto:

liftArrIO :: (a -> IO b) -> IOSLA s a b 
liftArrIO f = IOSLA $ \s x -> fmap (\y -> (s, [y])) (f x) 
+1

[ 'arrIO'] (http://hackage.haskell.org/packages/archive/hxt/9.1.4/doc/html/ Control-Arrow-ArrowIO.html # v: arrIO) parece ser el que está buscando. Su implementación es básicamente idéntica a la tuya. – hammar

+0

@hammar: * ¡Ajá! * Gracias, por alguna razón, supuse que tendría "elevación" en el nombre. –

+0

Ahhh sí, ¡eso es precisamente! Cada vez que creo que tengo flechas y mónadas resueltas, termino descifrándolo todo de nuevo ... – John

Cuestiones relacionadas