在我的haskell 游戲的主要功能中,我首先加載每個精靈。我決定創建一個名為 SpriteCollection 的資料型別,它包含所有精靈(型別化Picture),以便我以后可以通過它們的名稱訪問它們。
loadBMP 是一個 Gloss 函式型別String -> IO Picture。此代碼有效:
main = do
-- Load sprites
playerBmp <- loadBMP "assets/mario.bmp"
goombaBmp <- loadBMP "assets/goomba.bmp"
brickBmp <- loadBMP "assets/brick.bmp"
let sprites = SpriteCollection {
marioSprite = playerBmp,
goombaSprite = goombaBmp
brickSprite = brickBmp
}
playIO (... sprites ...)
正如你所看到的,當我加載更多精靈時,感覺就像我正在撰寫我應該需要的雙倍代碼。有沒有辦法擺脫中間變數?例如:
main = do
-- Load sprites
let sprites = SpriteCollection {
marioSprite <- loadBMP "assets/mario.bmp",
goombaSprite <- loadBMP "assets/goomba.bmp",
brickSprite <- loadBMP "assets/brick.bmp"
}
playIO (... sprites ...)
但這不起作用。
uj5u.com熱心網友回復:
您可以RecordWildCards為此使用:
{-# LANGUAGE RecordWildCards #-}
main = do
-- Load sprites
marioSprite <- loadBMP "assets/mario.bmp"
goombaSprite <- loadBMP "assets/goomba.bmp"
brickSprite <- loadBMP "assets/brick.bmp"
let sprites = SpriteCollection {..}
playIO (... sprites ...)
uj5u.com熱心網友回復:
Applicative 是用于組合同一背景關系中的多個值的工具。
main = do
sprites <- SpriteCollection <$>
loadBMP "mario" <*>
loadBMP "goomba" <*>
loadBMP "brick"
...
一般來說,
do
x <- mx
y <- my
return (f x y)
可以寫成
f <$> mx <*> my
但前提是最終呼叫f是唯一參考xand的東西y。這種方法可以擴展到任意多個引數。對于少量引數,您可以嘗試liftA函式族中的某些內容,例如liftA2 f mx my.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528496.html
標籤:哈斯克尔光泽度
