您好,有人可以向我解释一下如何在代数数据类型的字段上使用monadic绑定运算符或记录语法吗?
data M = M {myfield :: Int}
data N = N Int
因此对于M
,如果我想从IO Int
动作中提取值到myfield
中,看来我不能说:
a = M { return 3 >>= value }
我又如何绑定N
类型?
答案 0 :(得分:7)
该字段的类型为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
相反,您可以按以下方式将N
转换为M
convertNtoM :: N -> M
convertNtoM (N i) = M { myfield = i }
同样,这不会将N
值绑定到myfield
,而是将整数{inside”绑定到N
值。
如果要执行多个操作,并且要填写许多字段,则可以使用“应用样式”。
data K = K Int Int Int Int
action :: IO Int
action = return 3
foo :: IO K
foo = K <$> action <*> action <*> action <*> action