好的,假设我有IO
个操作; loadFile :: FilePath -> ByteString
处理processData :: ByteString -> ProcessedData
这个操作非常有用,我想在两个动作中使用这个处理过的数据,如下所示:
main = do
{
bytes <- loadFile "....";
let data = processData bytes
in printf (extractFoo data address1)
printf (extractFoo data address2) -- Compiler error
}
我知道我可以这样做,这基本上不会在两个动作之间共享data
:
main = do
{
bytes <- loadFile "....";
let data = processData bytes
in printf (extractFoo data address1);
let data = processData bytes
in printf (extractFoo data address2);
}
如何在data
中分享printf
?我对Haskell很新,我正在与IO monad斗争。我试图理解它,但到目前为止这是一个缓慢的过程。
答案 0 :(得分:5)
只需删除大括号并使用普通let
:
main = do
bytes <- loadFile "...."
let d = processData bytes
printf (extractFoo d address1)
printf (extractFoo d address2)
我将您的data
重命名为d
,因为data
是Haskell中的关键字。