免责声明:我对Haskell.有点陌生
我正在编写一个解释器,或者在这种情况下,写一个REPL。为此,我使用了haskeline,这对REPLs来说很不错。它具有将命令行历史记录存储在文件中的功能,这也很不错。
不过,我在使用它时遇到的一个问题是,它似乎没有将"~“扩展到主目录,这意味着我必须手动检索主目录。
我可以这样做(现在也是这样):
-- | 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还不熟悉,现在就读这个问题:假装它不在那里。
发布于 2015-04-10 19:10:37
更好的方法是在IO中生成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
}这无疑需要对您当前的软件进行一些更改,但这将被认为是实现这一目标的“正确”方法。
https://stackoverflow.com/questions/29568718
复制相似问题