gpt4 book ai didi

haskell - 显示 IO 类型

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

我有一个数据类型,其中包含 IORef 作为重要元素。这意味着没有一种干净的方法可以使其成为 show 类型类的成员。这还不错,因为我在这种类型的 IO monad 中有一个 print 函数。但在 GHCi 中很烦人,因为每次我返回其中一个结果时,我都会收到一条错误,指出它无法显示。

有没有办法让 GHCi(无论如何都在 IO monad 中运行)使用 IO 操作来显示结果?如果不是,那么编写 show a = unsafePerformIO $ print a 是否会有任何负面后果?

最佳答案

您是否考虑过在 .ghci 文件中添加如下内容:

instance (Show a) => Show (IORef a) where
show a = show (unsafePerformIO (readIORef a))

它一点也不安全,但如果这只是供您个人使用,也许那是可以的。

对于更一般的用途,之前给出的答案对我来说看起来不错。也就是说,要么定义静态“我无法显示此”消息:

instance Show (IORef a) where
show _ = "<ioref>"

这会给出类似的内容:

> runFunc
MyStruct <ioref> 4 "string val"

或者使用自定义函数。我建议创建一个类并提升所有 Show 实例:

class ShowIO a where
showIO :: a -> IO String

instance Show a => ShowIO a where
showIO = return . show
instance ShowIO a => ShowIO (IORef a) where
showIO a = readIORef a >>= showIO

给出输出(未经测试,这只是手写的):

> myFunc >>= showIO
MyStruct "My String in an IORef" 4 "string val"

关于haskell - 显示 IO 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8332307/

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