hel*_*rve 3 haskell haskeline io-monad
免责声明:我对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"
Run Code Online (Sandbox Code Playgroud)
但是这种使用unsafePerformIO,这让我感到畏缩.您是否知道一个良好而干净的解决方法,不涉及重写整个功能?这可能是haskeline我不知道的功能或者我没看到的功能.
告诉我没有办法改写和重新思考它一切都很好.
编辑:
我知道unsafePerformIO很糟糕,这就是为什么它让我畏缩.如果你是Haskell的新手并且现在正在阅读这个问题:假装它不在那里.
更好的方法是在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
}
Run Code Online (Sandbox Code Playgroud)
毫无疑问,这需要对您当前的软件进行一些更改,但这将被视为解决此问题的"正确"方法.