怎麼給一個「IO SDL.Surface」給需要「SDL.Surface」的功能?
我寧願重新思考我的整個方法,而不是訴諸於使用「unsafePerformIO」之類的東西,除非這實際上是正確的時間來使用它(我懷疑)。
進一步信息:
我充滿數字和文件路徑文件,我已經分析此文件,並加載位於這些路徑的圖像轉換成一個列表[(智力,IO SDL.Surface)] 。問題是,SDL.blitSurface函數需要一個正常的SDL.Surface。
錯誤消息:
Couldn't match type `IO SDL.Surface'
with `GHC.ForeignPtr.ForeignPtr SDL.SurfaceStruct'
Expected type: SDL.Surface
Actual type: IO SDL.Surface
我不知道,源代碼是必要回答這個問題,但我會提供一些反正以防萬一它有助於:
要加載圖像文件我用:
loadImage :: FilePath -> IO SDL.Surface
loadImage [] = error "empty list"
loadImage a =
SDL.loadBMP a
要創建數字和圖像我用的列表:
createIDImageList :: [Tiletype] -> [(Int, IO SDL.Surface)]
createIDImageList a =
if null a then []
else [(tiletypeid $ a !! 0, loadImage (C8.unpack (tiletypeimage (a !! 0))))] ++ createIDImageList (tail a)
爲了取回該列表中正確的畫面,我用這個函數:
imageFromID :: Int -> [(Int, IO SDL.Surface)] -> Maybe (IO SDL.Surface)
imageFromID a b =
if null b then Nothing
else if a == (fst $ b !! 0) then Just (snd $ b !! 0)
else imageFromID a (tail b)
最後我用imageFromID與SDL.blitSurface繪製圖像,但我不能因爲IO 。
感謝MathematicalOrchid,這似乎確實是在正確的方向。我需要更改imageFromID函數,不是嗎? – user3638162
@ user3638162是的,沒錯。你能解決它,還是需要提示? – MathematicalOrchid
不幸的是,我需要一個提示。我知道該函數需要做的變成'imageFromID :: Int - > IO [(Int,SDL.Surface)] - > Maybe(SDL.Surface)''但我不知道如何寫這個。我需要爲此使用地圖嗎? – user3638162