3

免责声明:我对 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 的新手并且现在正在阅读这个问题:假装它不存在。

4

1 回答 1

5

更好的方法是在Settings内部生成对象IO,而不是相反,可以这么说:

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
        }

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

于 2015-04-10T19:10:37.477 回答