免责声明:我对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
不好,这就是为什么它让我畏缩的原因。如果你是哈斯克尔的新手,现在正在阅读这个问题:假装它不在那里。
更好的方法是在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
}
毫无疑问,这将需要对您当前的软件进行一些更改,但这将被认为是实现这一目标的"正确"方式。