gpt4 book ai didi

haskell - 不安全 IO 或 : Haskeline and Directories

转载 作者:行者123 更新时间:2023-12-01 11:33:52 27 4
gpt4 key购买 nike

免责声明:我对 Haskell 有点陌生。

我正在编写一个解释器,或者,在这种情况下,一个 REPL。为此,我使用了 haskeline,它非常适合 REPL。它具有在文件中存储命令行历史记录的功能,这也很好。

不过,我在使用它时遇到的一个问题是它似乎没有将“~”扩展到主目录,这意味着我必须手动检索主目录。

我可以这样做(并且目前正在这样做):

-- | returns a fresh settings variable
addSettings :: Env -> Settings IO
addSettings env = Settings { historyFile = Just getDir
, complete = completeWord Nothing " \t" $
return . completionSearch env
, autoAddHistory = True
}
where
getDir :: FilePath
getDir = unsafePerformIO getHomeDirectory ++ "/.zepto_history"

但这使用了 unsafePerformIO,这让我感到畏缩。您知道不涉及重写整个函数的良好且干净的解决方法吗?这可能是我不知道的 haskeline 功能,或者我只是没看到的东西。

告诉我没有办法绕过重写和重新思考这一切也很好。

编辑:

我知道 unsafePerformIO 不好,这就是它让我畏缩的原因。如果您是 Haskell 的新手并且现在正在阅读这个问题:假装它不存在。

最佳答案

更好的方法是在 IO 中生成 Settings 对象,而不是反过来,可以这么说:

addSettings :: Env -> IO (Settings IO)
addSettings = do
getDir <- fmap (++ "/.zepto_history") getHomeDirectory
return $ Settings
{ historyFile = Just getDir
, complete = completeWord Nothing " \t" $ return . completionSearch env
, autoAddHistory = True
}

这无疑需要对您当前的软件进行一些更改,但这被认为是解决此问题的“正确”方法。

关于haskell - 不安全 IO 或 : Haskeline and Directories,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29568718/

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