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
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. Utilizzo di una monade all'interno della monade IO
- 2. Perché Scala non ha una Monade IO?
- 3. Haskell monade: IO [Doppia] a [IO Doppia]
- 4. Escaping dalla monade IO all'interno della monade Continuazione
- 5. Interazione IO e forse monade
- 6. IO Monade in lingue dinamicamente tipizzate
- 7. Scala IO monade: qual è il punto?
- 8. Ricorsione in una monade
- 9. scegliere una monade in fase di esecuzione
- 10. mappe Haskell ritorno una monade
- 11. Usando una monade rango-2 di tipo
- 12. Haskell: Monade di monade
- 13. HowTo: traccia una linea con una freccia?
- 14. La monade IO impedisce il cortocircuito della mappaM incorporata?
- 15. Haskell: calcolo "in una monade" - che significa?
- 16. Perché Scalas non è una monade?
- 17. Non è una monade, ma che cos'è?
- 18. Estrazione di una Forse valore nel IO
- 19. StringScanner scansione IO invece di una stringa
- 20. esempio MonadTransControl per una monade personalizzato
- 21. QuickCheck Gen non è una monade
- 22. Disegno animazione di una freccia in SVG
- 23. Qual è la differenza tra una monade e una chiusura?
- 24. Mostra per tipi di IO
- 25. Monade di Haskell contro Monade di APL
- 26. Come può una funzione pura fare IO?
- 27. Metodi di flatMap multipli per una singola monade?
- 28. Esaminando la struttura di legame in una monade libera AST
- 29. Come trasformare eventi con una funzione IO?
- 30. Come disegnare una freccia in Silverlight
[ '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
@hammar: * Aha! * Grazie, per qualche motivo ho pensato che avrebbe "sollevato" nel nome. –
Ahhh sì, è proprio così! Ogni volta che penso di avere le frecce e le monade finite, finisco per capirle di nuovo ... – John