gpt4 book ai didi

haskell - 界定 IO 单子(monad)

转载 作者:行者123 更新时间:2023-12-02 02:08:08 35 4
gpt4 key购买 nike

很高兴从签名中知道(至少在 Safe Haskell 中)某些东西是否执行 IO 操作,但 IO 包含很多不同的东西 - putStr、数据库访问、删除和写入文件、IORef 等。

如果我在运行任意代码时使用类型签名作为安全措施,那么我可能愿意接受一些 IO 操作 - 例如 putStr 等- 但不是其他人。

有没有办法定义 IO monad 的受限版本,仅包含正常 IO 操作的子集?如果是这样,我们将非常欢迎提供一个示例(例如使用 putStr)!

最佳答案

作为我评论的后续内容,您可以使用类似的内容自行实现

class Monad io => Stdout io where
putStr_ :: String -> io ()
putStrLn_ :: String -> io ()
print_ :: Show a => a -> io ()
-- etc

instance Stdout IO where
putStr_ = putStr
putStrLn_ putStrLn
print_ = print

myFunc :: Stdout io => io ()
myFunc = do
val <- someAction
print_ val
let newVal = doSomething val
print_ newVal

main :: IO ()
main = myFunc

这绝对没有运行时开销,因为 GHC 将优化这些类型类以仅使用 IO monad,它是可扩展的,易于编写,并且可以与 monad 转换和 结合使用>MonadIO 类非常容易。如果您有多个类,例如定义了 getLine_getChar_ 等的 Stdin 类,您甚至可以将这些类型类与

class (Stdout io, Stdin io) => StdOutIn io where

myFunc :: StdOutIn io => io ()
myFunc = do
val <- getLine_
putStrLn_ $ "Echo: " ++ val

main :: IO ()
main = myFunc

关于haskell - 界定 IO 单子(monad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20318936/

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