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功能,让你的"展开"值.实际上,它将结果作为参数传递给下一个"声明" - 谷歌围绕"脱糖做法"和类似的.
| 归档时间: |
|
| 查看次数: |
319 次 |
| 最近记录: |