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

Ber*_*ian 3 monads haskell

您好,有人可以解释一下如何在代数数据类型或记录语法的字段上使用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类型?

chi*_*chi 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
Run Code Online (Sandbox Code Playgroud)

相反,你可以转换NM如下

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)