不安全 IO 或:Haskeline 和目录

Unsafe IO Or: Haskeline and Directories

免责声明:我对 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
        }

这无疑需要对您当前的软件进行一些更改,但这将被视为 "right" 解决此问题的方法。