如何在ADT上使用Monadic绑定运算符或记录语法

时间:2018-09-12 10:12:08

标签: haskell monads

您好,有人可以向我解释一下如何在代数数据类型的字段上使用monadic绑定运算符或记录语法吗?

例如

data M = M {myfield :: Int}
data N = N Int

因此对于M,如果我想从IO Int动作中提取值到myfield中,看来我不能说:

a = M { return 3 >>= value }

我又如何绑定N类型?

1 个答案:

答案 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