おそらく私はこれを間違った方法で行っていますが、HXTを使用して、HOpenGLの配列で使用したいいくつかの頂点データを読み込みます。頂点配列は、newArrayを呼び出して作成されたPtrである必要があります。残念ながら、newArrayはIO Ptrを返すため、Arrow内でそれを使用する方法がわかりません。IO a-> Arrow aに似た型宣言を持つものが必要だと思いますか?
1 に答える
タイプIO a -> Arrow a
は意味がありません。は型クラスであり、またはArrow
のような特定の型ではありません。具体的には、のインスタンスは、関数のように構成できるものを記述し、型をエンドツーエンドで照合する2つのパラメーターを受け取る型コンストラクターです。したがって、矢印に変換することは、おそらく概念型エラーと呼ばれる可能性があります。Monad
Num
Arrow
IO a
何をしようとしているのか正確にはわかりませんが、IO
操作をの一部として本当に使用したい場合は、インスタンスにそれを含めるArrow
必要があります。その最も単純な形式は、任意のインスタンスArrow
のような型を持つ関数が明白な方法で構成できることを観察することです。パッケージは、より複雑なタイプを提供しているようです。a -> m b
Monad
hxt
newtype IOSLA s a b = IOSLA { runIOSLA :: s -> a -> IO (s, [b]) }
これは、、、およびモナドの混合物でありIO
、上記のように関数にアタッチされているため、各ステップで3つすべてを通過してそれらを構成できます。私はあまり使用していませんが、これらが使用している場合は、任意の関数を持ち上げて1つとして機能させるのは非常に簡単です。状態値を変更せずに渡して、関数の出力を次のように変換するだけです。シングルトンリスト。これを行う機能はすでにあるかもしれませんが、一目見ただけではわかりませんでした。State
[]
Monad
hxt
Arrow
IO
s
基本的に、次のようなものが必要です。
liftArrIO :: (a -> IO b) -> IOSLA s a b
liftArrIO f = IOSLA $ \s x -> fmap (\y -> (s, [y])) (f x)