不安全IO或:Haskeline和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不好,这就是为什么它让我畏缩的原因。如果你是哈斯克尔的新手,现在正在阅读这个问题:假装它不在那里。

更好的方法是在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
}

毫无疑问,这将需要对您当前的软件进行一些更改,但这将被认为是实现这一目标的"正确"方式。

相关内容

  • 没有找到相关文章

最新更新