首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不安全IO或: Haskeline和目录

不安全IO或: Haskeline和目录
EN

Stack Overflow用户
提问于 2015-04-10 18:51:32
回答 1查看 138关注 0票数 3

免责声明:我对Haskell.有点陌生

我正在编写一个解释器,或者在这种情况下,写一个REPL。为此,我使用了haskeline,这对REPLs来说很不错。它具有将命令行历史记录存储在文件中的功能,这也很不错。

不过,我在使用它时遇到的一个问题是,它似乎没有将"~“扩展到主目录,这意味着我必须手动检索主目录。

我可以这样做(现在也是这样):

代码语言:javascript
复制
-- | 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还不熟悉,现在就读这个问题:假装它不在那里。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-10 19:10:37

更好的方法是在IO中生成IO对象,而不是相反的方法,可以这样说:

代码语言:javascript
复制
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
        }

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29568718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档