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
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)
[ '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
@hammar: * Aha! * Dzięki, z jakiegoś powodu założyłem, że w nazwie będzie "podnosić". –
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