gpt4 book ai didi

haskell 全局变量

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

任务是创建动态链接库,它封装了数据库的辛勤工作。由于一些设计限制,我有一个定义的接口(interface),其中包含许多功能。每个函数都接受一个参数并在数据库查询中使用它们。数据库连接应该在 dll 中,应用程序不想打扰是否有任何连接。

初始化数据库连接然后将其提供给每个函数而不显式传递它的最佳方法是什么。

当然,总的来说,我想使用 State monad。但 dll 并非设计为只有一个入口点。

最佳答案

听起来您正在尝试创建一个可以从其他语言调用的 DLL。如果是这样,那么您的所有功能都将存在于 IO monad 中。因此,您可以使用 IORef 来存储数据库连接对象。

更新(见下面的评论)

GHC 与全局随机数生成器状态有类似的问题。以下是 System.Random 的相关源代码:

-- |Gets the global random number generator.
getStdGen :: IO StdGen
getStdGen = readIORef theStdGen

theStdGen :: IORef StdGen
theStdGen = unsafePerformIO $ do
rng <- mkStdRNG 0
newIORef rng

所以大概类似的东西适用于数据库连接。是的,这是使用邪恶的 unsafePerformIO,但有时你必须是邪恶的。

关于haskell 全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1873075/

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