gpt4 book ai didi

haskell - 我可以在这里使用绑定(bind)/fmap吗

转载 作者:行者123 更新时间:2023-12-03 14:57:49 24 4
gpt4 key购买 nike

loadTexture :: String -> IO (Either String GL.GLuint)
loadTexture filename = do
p <- PNG.loadPNGFile filename
oglLoadImg p
where
oglLoadImg :: (Either String PNG.PNGImage) -> IO (Either String GL.GLuint)
oglLoadImg (Left e) = return $ Left e
oglLoadImg (Right png) = do
... I need todo IO stuff in here

上面的代码看起来真的很臃肿和讨厌。我能做些什么来使它更简单?

最佳答案

您基本上想要 Either e 的组合monad 和 IO单子(monad)。就是这样 monad transformers是给!

在这种情况下,您可以使用 the ErrorT monad transformer使用 Either 添加错误处理到底层 monad,在本例中为 IO .

import Control.Monad.Error

loadTexture :: String -> IO (Either String GL.GLuint)
loadTexture filename = runErrorT $ ErrorT (PNG.loadPNGFile filename) >>= oglLoadImg
where
oglLoadImg :: PNG.PNGImage -> ErrorT String IO GL.GLuint
oglLoadImg png = do
-- [...]

这保留了旧界面,尽管使用 ErrorT 可能会更好。也适用于您的功能,并调用 runErrorT在您的 main功能。
loadTexture :: String -> ErrorT String IO GL.GLuint
loadTexture filename = ErrorT (PNG.loadPNGFile filename) >>= oglLoadImg
where
oglLoadImg :: PNG.PNGImage -> ErrorT String IO GL.GLuint
oglLoadImg png = do
-- [...]

Monad 转换器可能需要一些时间来适应,但它们非常有用。

关于haskell - 我可以在这里使用绑定(bind)/fmap吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7167190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com