您好,有人可以解释一下如何在代数数据类型或记录语法的字段上使用monadic绑定运算符?
data M = M {myfield :: Int}
data N = N Int
Run Code Online (Sandbox Code Playgroud)
因此,M如果我想从一个IO Int动作中提取值到myfield 它似乎我不能说:
a = M { return 3 >>= value }
Run Code Online (Sandbox Code Playgroud)
另外我怎么能绑定一个N类型?
该字段具有类型Int,因此您无法将其绑定到任何其他类型的内容,例如IO Int.
但是,您可以运行IO Int操作,Int退回并使用它.
foo :: IO Something
foo = do
i <- return 3 -- run your (IO Int) action
let a = M { myfield = i }
...
-- at the end, you have to use an (IO Something) action
Run Code Online (Sandbox Code Playgroud)
相反,你可以转换N到M如下
convertNtoM :: N -> M
convertNtoM (N i) = M { myfield = i }
Run Code Online (Sandbox Code Playgroud)
这同样不会将N值绑定到myfield,而是绑定值"内部"的整数N.
如果要运行多个动作,并且要填充许多字段,则可以使用"应用样式".
data K = K Int Int Int Int
action :: IO Int
action = return 3
foo :: IO K
foo = K <$> action <*> action <*> action <*> action
Run Code Online (Sandbox Code Playgroud)