2011-08-30 12 views
6

Forse sto andando in questo modo, ma sto usando HXT per leggere in alcuni dati di vertice che vorrei usare in una matrice in HOpenGL. Gli array Vertex devono essere un Ptr che viene creato chiamando newArray. Sfortunatamente newArray restituisce un IO Ptr, quindi non sono sicuro di come utilizzarlo all'interno di un Arrow. Penso di aver bisogno di qualcosa con una dichiarazione di tipo simile a IO a -> Arrow a?Chiamare una Monade IO all'interno di una freccia

risposta

5

Il tipo IO a -> Arrow a non ha senso; Arrow è una classe di tipo, non un tipo specifico, molto simile a Monad o Num. In particolare, un'istanza di Arrow è un costruttore di tipi che accetta due parametri che descrivono cose che possono essere composte come funzioni, i tipi di corrispondenza end-to-end. Pertanto, la conversione di IO a in una freccia potrebbe essere definita errore di tipo concettuale.

non sono sicuro esattamente quello che stai cercando di fare, ma se si vuole veramente essere utilizzando IO operazioni come parte di un Arrow, è necessario l'istanza Arrow di includere tale. La forma più semplice è osservare che le funzioni con tipi come a -> m b per qualsiasi istanza di Monad possono essere composte in modo ovvio. Il pacchetto hxt sembra fornire un tipo più complicato:

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

Questo è un misto delle IO, State e [] monadi, collegato a una funzione come sopra tale che è possibile comporli passare attraverso tutti e tre Monad s ad ogni passo. Non ho usato molto lo hxt, ma se si tratta di Arrow s con cui si sta lavorando, è piuttosto semplice sollevare una funzione arbitraria di IO per fungere da unica: basta passare il valore di stato s invariato e ruotare l'output della funzione in una lista di singleton. Potrebbe esserci già una funzione per farlo, ma non ne ho visto uno a una breve occhiata.

In sostanza, che ci si vuole qualcosa di simile:

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) sembra essere quello che sta cercando. La sua implementazione è sostanzialmente identica alla tua. – hammar

+0

@hammar: * Aha! * Grazie, per qualche motivo ho pensato che avrebbe "sollevato" nel nome. –

+0

Ahhh sì, è proprio così! Ogni volta che penso di avere le frecce e le monade finite, finisco per capirle di nuovo ... – John