2011-08-30 15 views
6

Być może idę o tym w niewłaściwy sposób, ale używam HXT do odczytu w niektórych danych werteksów, które chciałbym użyć w tablicy w HOpenGL. Macierze Vertex muszą być Ptr, które jest tworzone przez wywołanie newArray. Niestety, newArray zwraca IO Ptr, więc nie jestem pewien, jak użyć go wewnątrz Strzałki. Myślę, że potrzebuję czegoś z deklaracją typu podobną do IO a -> Arrow a?Wywołanie IO Monada wewnątrz strzałki

Odpowiedz

5

Typ IO a -> Arrow a nie ma sensu; Arrow to klasa typu, nie określonego typu, podobnie jak Monad lub Num. Konkretnie, instancja Arrow jest konstruktorem typu, który przyjmuje dwa parametry opisujące elementy, które mogą składać się z funkcji, dopasowując typy od końca do końca. Tak więc przekształcenie IO a w strzałkę może być nazywane błędem pojęciowym.

nie jestem pewien dokładnie, co próbujesz robić, ale jeśli naprawdę chcesz używać IO operacji w ramach Arrow, trzeba instancji Arrow włączenie tego. Najprostszą tego metodą jest obserwacja, że ​​funkcje o typach takich jak a -> m b dla dowolnej instancji Monad mogą być tworzone w oczywisty sposób. Pakiet hxt wydaje się zapewniać bardziej skomplikowany typ:

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

to jakaś mieszanina IO, State i [] monad, dołączony do funkcji jak wyżej, tak że można komponować je przeżywa wszystkich trzech Monad s na każdym kroku. Tak naprawdę nie używałem zbyt wiele hxt, ale jeśli są to Arrow, z którymi pracujesz, bardzo łatwo jest podnieść dowolną funkcję IO, aby służyć jako jedna - po prostu przepuść wartość stanu s przez niezmienioną, i obróć wyjście funkcji na listę singleton. Być może jest już taka funkcja, aby to zrobić dla ciebie, ale nie zauważyłem ani jednego na krótką chwilę.

zasadzie, że chcesz coś takiego:

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) wydaje się być tym, którego szuka. Jego implementacja jest zasadniczo identyczna z twoją. – hammar

+0

@hammar: * Aha! * Dzięki, z jakiegoś powodu założyłem, że w nazwie będzie "podnosić". –

+0

Ahhh tak, to jest dokładnie! Za każdym razem, gdy myślę, że mam strzały i monady, wymyśliłem, że znowu je wymyśliłem ... – John

Powiązane problemy