Поле имеет тип 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