gpt4 book ai didi

haskell - 在 Haskell 中从 IO 中获取元素

转载 作者:行者123 更新时间:2023-12-03 13:06:04 32 4
gpt4 key购买 nike

我正在通过惊人的 Write Yourself a Scheme in 48 Hours并已完成核心任务并想扩展它但遇到了问题。我想做的是制作eval运行时可用的函数,但在将其存储到全局环境中时遇到问题。

运行时环境的类型:

type Env = IORef [(String, IORef LispVal)]

Haskell eval实现的类型是:
eval :: Env -> LispVal -> IOThrowsError LispVal

全局环境是一个类型的映射:
primitiveBindings :: IO Env

因为它包含执行 IO 的函数和纯函数。我的尝试是设置运行时 eval给主机 eval部分应用于全局环境,如下所示:
baseFun :: [(String, [LispVal] -> IOThrowsError LispVal)]
baseFun = [("eval", unaryOp (eval (liftIO $ readIORef primitiveBindings)))]

在哪里 unaryOp是:
unaryOp :: (LispVal -> ThrowsError LispVal) -> [LispVal] -> ThrowsError LispVal
unaryOp f [v] = f v

然后我想将元素添加到全局环境中,但出现以下编译错误:
Couldn't match expected type `IORef a'
against inferred type `IO Env'
In the first argument of `readIORef', namely `primitiveBindings'
In the second argument of `($)', namely `readIORef primitiveBindings'
In the first argument of `eval', namely
`(liftIO $ readIORef primitiveBindings)'

看来 readIORef env 的这种模式在代码中经常发生,所以不清楚为什么它在这里不起作用。我将非常感谢对我的错误的启发。作为引用,我的代码几乎与 final code for the original tutorial 完全相同作为引用。

谢谢

最佳答案

据我所知,primitiveBindings不是一个全局环境,而是一个 Action ,当它被执行时,会生成一个新的映射与已经设置的原始绑定(bind)。也许更好的名字是createPrimitiveBindings .如果没有 unsafePerformIO,就无法在 Haskell 中拥有正确的全局变量。黑客。

因此,您尝试添加 eval 的方式将使它在新环境中评估所有内容,因为您正在重新运行 primitiveBindings行动。如果这确实是您想要的,我们可以轻松地处理类型错误:

baseFun :: [(String, [LispVal] -> IOThrowsError LispVal)]
baseFun = [("eval", evalInNewEnv)]
where evalInNewEnv args = do
env <- liftIO primitiveBindings
unaryOp (eval env) args

如您所见,不需要任何 readIORef在这里,因为 eval已经期待 Env这只是 IORef 的类型同义词.

但是,我觉得你喜欢 eval要在“全局”环境中工作,在这种情况下,您需要以某种方式将此环境传递给您,因为正如我所提到的,没有全局变量。例如,我们可以定义这样的东西,它会用 eval 创建一个新环境。在里面。
primitiveBindingsWithEval :: IO Env
primitiveBindingsWithEval = do
env <- primitiveBindings
bindVars env [("eval", unaryOp (eval env))]

然后,您可以替换 primitiveBindings 的现有用途。与 primitiveBindingsWithEval当您想要一个清新的环境时, eval在里面。

关于haskell - 在 Haskell 中从 IO 中获取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10525593/

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