2011-08-30 24 views
6

Belki de bu yanlış yoldan gidiyorum, ancak HOpenGL'de bir dizide kullanmak istediğim bazı vertex verilerinde okumak için HXT kullanıyorum. Vertex dizilerinin newArray çağrılarak oluşturulmuş bir Ptr olması gerekir. Ne yazık ki, newArray bir IO Ptr döndürüyor, bu yüzden bir Ok içinde kullanmak için nasıl gideceğinden emin değilim. Sanırım IO a -> Ok a'ya benzer türde bir bildirime ihtiyacım var.Bir Ok İçinde bir IO Monad çağırma

cevap

5

IO a -> Arrow a türü anlamlı değildir; Arrow, tür sınıfı değil, belirli bir tür değil, Monad veya Num gibi. Spesifik olarak, Arrow'un bir örneği, işlevler ve uçtan uca eşleme türleri gibi oluşturulabilecek şeyleri tanımlayan iki parametreyi alan bir tür kurucudur. Yani, IO a'u bir oka dönüştürmek, bir kavramsal tip hatası olarak adlandırılabilir.

Ne yapmaya çalışıyorsun tam olarak emin değilim, ama sen gerçekten bir Arrow parçası olarak IO işlemleri kullanarak istiyorsanız, bunu içerecek şekilde Arrow örneğini gerekir. Bunun en basit şekli,örneği için a -> m b gibi işlevlerin, açık şekilde oluşturulabileceğini gözlemektir. Onları her üç Monad s geçmekte oluşturduğunuz ki yukarıdaki gibi bu IO, State ve [] monad'ların bazı karışımıdır

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

, bir işleve bağlı: hxt paket daha karmaşık bir türü sağlamak gibi görünüyor her adımda. Ben gerçekten hxt kullanmıyoruz, ama bunlar ile çalışıyorsanız Arrow s çalışıyorsanız, bir rasgele IO işlevini kaldırmak için oldukça basit - tek bir değişiklik yapmadan s durum değerini geçmek ve çıktıyı açmak tekil listeye fonksiyonun. Bunu sizin için bir işlev zaten olabilir, ancak kısa bir bakışta görmedim.

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/:

Temelde, böyle bir şey ister ki Control-Arrow-ArrowIO.html # v: arrIO) aradığı gibi görünüyor. Uygulaması temel olarak sizinkilerle aynıdır. – hammar

+0

@hammar: * Aha! * Teşekkürler, bir nedenden dolayı isminde "kaldırma" olacağını düşündüm. –

+0

Ahhh evet, işte tam olarak bu! Her seferinde oklarım ve monad'ları anladığımı düşündüğümde, onları tekrar ortaya çıkarmaya başladım. – John

İlgili konular