gpt4 book ai didi

haskell - 如何使用 JuicyPixels 写入像素? (在 ST monad 中)

转载 作者:行者123 更新时间:2023-12-04 17:18:23 25 4
gpt4 key购买 nike

我想将一些像素写入图像,并将图像写入磁盘。我一直遵循我从许多 Haskeller 那里听到的建议,遵循类型签名,基本上玩“俄罗斯方 block 类型”,直到我到达我要去的地方。它主要对我有用,但我遇到了一些麻烦。

要写一个像素,有一个函数:

writePixel :: PrimMonad m => MutableImage (PrimState m) a -> Int -> Int -> a -> m ()

我可以从签名中得知我需要向它传递一个 MutableImage,所以我寻找一个带有 MutableImage 的函数:

createMutableImage :: (PrimMonad m, Pixel px) => Int -> Int -> px -> m (MutableImage (PrimState m) px)

这似乎在某种状态 monad 中运行。

writeIt = runST $ createMutableImage 100 100 (100::Pixel8)  >>=
freezeImage

这有效,并返回我可以写入磁盘的漂亮的灰色图像。但是我不知道如何获取 MutableImage 以便我可以向其写入像素!简单地插入 writePixel 调用会给我一个我无法完全理解的错误:

writeIt = runST $ createMutableImage 100 100 (100::Pixel8)  >>=
writePixel 100 100 255 >>=
freezeImage

结果:

Couldn't match type `MutableImage (PrimState (GHC.ST.ST s)) px0'
with `()'
Expected type: () -> GHC.ST.ST s (Image px0)
Actual type: MutableImage (PrimState (GHC.ST.ST s)) px0
-> GHC.ST.ST s (Image px0)
In the second argument of `(>>=)', namely `freezeImage'
In the second argument of `($)', namely
`createMutableImage 100 100 (100 :: Pixel8)
>>= writePixel 100 100 255
>>= freezeImage'
In the expression:
runST
$ createMutableImage 100 100 (100 :: Pixel8)
>>= writePixel 100 100 255
>>= freezeImage

我可以从 writePixel 签名中看出我缺少 writePixel 的第一个参数。我如何获得对 MutableImage 的引用以便我可以写入它?更重要的是,我如何才能立足于这个 monad 内部的类型,以便我自己解决这些问题?

最佳答案

你基本上做对了,你只是混淆了论点的立场:

writeIt = runST $ do 
pic <- createMutableImage 100 100 (100::Pixel8)
writePixel pic 100 100 255
freezeImage pic

或者如果您不喜欢do 表示法:

writeIt = runST $
createMutableImage 100 100 (100::Pixel8) >>=
\pic -> writePixel pic 100 100 255 >>=
\nothing -> freezeImage pic

你写的等同于

writeIt = runST $ createMutableImage 100 100 (100::Pixel8)  >>=
\pic -> writePixel 100 100 255 pic >>=
\nothing -> freezeImage nothing

但这是完全错误的,因为 nothing 的类型是 () 并且 pic 应该位于第一个参数位置。

关于haskell - 如何使用 JuicyPixels 写入像素? (在 ST monad 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22594806/

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