不安全的IO或:Haskeline和目录

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的新手并且现在正在阅读这个问题:假装它不在那里.

bhe*_*ilr 5

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

毫无疑问,这需要对您当前的软件进行一些更改,但这将被视为解决此问题的"正确"方法.