Как использовать оператор связывания Monadic в ADT или синтаксис записи - PullRequest
0 голосов
/ 12 сентября 2018

Здравствуйте, может кто-нибудь, пожалуйста, объясните мне, как вы можете использовать оператор монадического связывания для поля алгебраического типа данных или синтаксиса записи?

Например,

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

Так что для Mесли я хочу извлечь значение из действия IO Int в myfield, кажется, я не могу сказать:

a = M { return 3 >>= value }

Также, как я могу связать для типа N?

1 Ответ

0 голосов
/ 12 сентября 2018

Поле имеет тип 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, но связывает целое число "внутри" значения N.


В случае если нужно выполнить несколько действий и заполнить много полей, можно использовать «аппликативный стиль».

data K = K Int Int Int Int

action :: IO Int
action = return 3

foo :: IO K
foo = K <$> action <*> action <*> action <*> action
...