摆脱Haskell的IO()

Mac*_*ski 3 monads serialization haskell

我很简单的应用程序具有保存/加载其当前状态的功能.保存功能如下所示:

doSave :: BoardType -> Field -> [Char] -> Bool 
doSave board player fileName = do
    let x = encodeFile fileName (board :: BoardType, player :: Field)
    True -- there will be exception handling 
Run Code Online (Sandbox Code Playgroud)

我的加载功能:

doLoad :: [Char] -> IO (BoardType, Field)
doLoad fileName = decodeFile fileName :: IO (BoardType, Field)
Run Code Online (Sandbox Code Playgroud)

并且有我的问题,加载后,我有 IO (BoardType, Field)不适合我的程序和其他可能不应接受IO参数的函数.如果我跟着这个IO升级,IO我的应用程序中就会有所有内容- 是否有必要(或者 - 使用haskell语言正常)?

最后 - 有一种简单的方法可以摆脱这种情况IO吗?

Ric*_*ton 10

需要一点时间才能习惯.

一些monad让你在一些工作之后提取"内在价值",但IO从来没有.

没有办法例如返回系统时间可能是"纯粹的",因此您使用它进行的任何计算都需要保留在IO中.

但是,这并不意味着您的大多数代码都存在于IO-land中.

main = do
  (bt, fld) <- doLoad "somefilename"
  let bResult = doSomethingPureWithBoard bt
  let fResult = doSomethingPureWithField fld
  let bt2     = updateBoard bt bResult fResult
  doSave "someFilename" bt2 fld                -- This should also be in IO
Run Code Online (Sandbox Code Playgroud)

你总是可以从IO调用纯函数,而不是相反.的<-,而你是在IO功能,让你的"展开"值.实际上,它将结果作为参数传递给下一个"声明" - 谷歌围绕"脱糖做法"和类似的.