gpt4 book ai didi

haskell - 测试一个值是否已被评估为弱头范式

转载 作者:行者123 更新时间:2023-12-03 13:54:56 25 4
gpt4 key购买 nike

在 Haskell 中,是否可以测试一个值是否已被评估为弱头范式?如果一个函数已经存在,我希望它有一个类似的签名

evaluated :: a -> IO Bool

有几个地方有类似的功能。

一个 previous answer向我介绍了 :sprint ghci 命令,它将仅打印已被强制为弱头正常形式的值的一部分。 :sprint可以观察一个值是否已经被评估:
> let l = ['a'..]
> :sprint l
l = _
> head l
'a'
> :sprint l
l = 'a' : _

有可能在 IO检查否则将是禁区的属性。例如,可以在 IO 中进行比较查看两个值是否来自同一个声明。这是由 StableName 提供的。在 System.Mem.StableName 中并著名地用于解决 data-reify 中的可观察共享问题.相关 StablePtr 不提供检查引用值是否为弱头正常形式的机制。

最佳答案

我不确定是否为此预先包装了任何东西。但是,可以对其进行编码:

import Data.IORef
import System.IO.Unsafe

track :: a -> IO (a, IO Bool)
track val = do
ref <- newIORef False
return
( unsafePerformIO (writeIORef ref True) `seq` val
, readIORef ref
)

这是 ghci 中的一个示例用法:
*NFTrack> (value, isEvaluated) <- track (undefined:undefined)
*NFTrack> isEvaluated
False
*NFTrack> case value of _:_ -> "neat!"
"neat!"
*NFTrack> isEvaluated
True

当然,这将跟踪包装后的 write-and-then-return-the-original-value thunk 是否被评估为 WHNF,而不是事物是否传递给 track被评估为 WHNF,所以你会想把它放在尽可能接近你感兴趣的 thunk 的地方——例如它无法告诉您在跟踪开始之前,其他人制作的 thunk 是否已经被其他人评估过。当然可以考虑使用 MVar而不是 IORef如果你需要线程安全。

关于haskell - 测试一个值是否已被评估为弱头范式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28687384/

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