3

私は遊んでいてGraphics.GD、次のように画像を値のマトリックスに読みたいと思いColorます:

rectFromImage :: Image -> IO [[Color]]
rectFromImage img = do
    size <- imageSize img
    return [[getPixel (x,y) img | x <- [1 .. fst size]] | y <- [1 .. snd size]]

明らかに、これは ではなく をgetPixel返すため機能しませIO ColorColor:

Couldn't match type `IO Color' with `Foreign.C.Types.CInt'
Expected type: Color
  Actual type: IO Color
In the return type of a call of `getPixel'
In the expression: getPixel (x, y) img
In the expression: [getPixel (x, y) img | x <- [1 .. fst size]]

getPixel呼び出しの戻りで「IO を取り除く」にはどうすればよいですか?

4

1 に答える 1

4

sequenceあなたが探している魔法の機能です。sequenceIO アクションのリストを取り、それを値の IO リストにします。型シグネチャの用語:

sequence :: Monad m => [m a] -> m [a]

または、より具体的には、あなたの場合:

sequence :: [IO a] -> IO [a]

たとえば、次のようにできます。

do
  putStrLn "Enter three lines of input:"
  irritatedUser <- sequence [getLine, getLine, getLine]
  putStrLn (irritatedUser !! 2)

そして、ユーザーが書いた最後の行が出力されます。

とにかく、あなたの場合、これはあなたがやりたいことを意味します

rectFromImage img = do
  size <- imageSize img
  sequence [sequence [getPixel (x,y) img | x <- [1 .. fst size]] | y <- [1 .. snd size]]

sequenceはそこに 2 つの呼び出しをこっそり入れました。あなた[[IO Color]]から へ、[IO [Color]]次に へIO [[Color]]

一般に、IO を「取り除く」ことはなく、単に上方に伝播します。

于 2013-09-03T07:13:29.733 に答える