2011-08-30 9 views
6

おそらく私はこれを間違った方法で行っていますが、HXTを使用して、HOpenGLの配列で使用するいくつかの頂点データを読み込んでいます。頂点配列は、newArrayを呼び出すことによって作成されるPtrである必要があります。残念ながら、newArrayはIO Ptrを返すので、Arrow内でどのように使用するかについてはわかりません。 IO a - > Arrow aと同様の型宣言が必要なのでしょうか?矢印内のIO Monadを呼び出す

答えて

5

タイプIO a -> Arrow aは意味がありません。 Arrowはタイプクラスであり、特定のタイプではありません。MonadまたはNumとよく似ています。具体的には、Arrowのインスタンスは、関数のように構成可能なものを記述する2つのパラメータを取り、型をエンドツーエンドで一致させる型コンストラクタです。したがって、IO aを矢印に変換することは、おそらく概念的なタイプのエラーと呼ばれる可能性があります。

あなたは何をしようとしているのかよく分かりませんが、実際にIO操作をArrowの一部として使用したい場合は、それを含めるにはArrowインスタンスが必要です。その最も簡単な形式は、のようなタイプの関数がすべてMonadインスタンスに対して明白な方法で構成できることを観察することです。 hxtパッケージには、より複雑なタイプを提供しているようだ:

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

これはIOのいくつかの混合物で、Stateで、あなたはすべての3つのMonad Sを経由して構成することができるように、上記のように関数に添付[]モナド、各段階で。私は実際にhxtをあまり使用していませんが、これらがArrowであれば、任意のIO関数を1つの役割を果たすように持ち上げるのはかなり簡単です - 状態値sをそのまま渡して出力を回すだけです関数をシングルトンリストに変換します。あなたのためにこれを行う機能がすでにあるかもしれませんが、私は一見してそれを見ませんでした。

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)が彼が探しているようだ。その実装は基本的にあなたのものと同じです。 – hammar

+0

@ハマー:* Aha!*ありがとう、何らかの理由で、私はそれが名前に "持ち上げ"を持つだろうと思った。 –

+0

ああ、はい、それは正確です!私が矢とモナドを持っていると思うたびに、私は彼らをもう一度考え直すことに気づきました... – John

関連する問題