如何在飞行中使用IO monad输出

eii*_*000 2 monads haskell

这就是我在做的事情:

data Person = Person (IORef String) (IORef Int)
name <- newIORef "Boston"
age <- newIORef 100
p = Person name age
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以将它们放在一行中,例如:

p = Person (newIORef "Boston") (newIORef (100::Int))
Run Code Online (Sandbox Code Playgroud)

有没有办法把它们放在一行?

ada*_*mse 8

您可以使用以下IO实例Applicative:

p <- Person <$> newIORef "Boston" <*> newIORef 100
Run Code Online (Sandbox Code Playgroud)

如果您使用的是旧版本,则base可能需要

import Control.Applicative
Run Code Online (Sandbox Code Playgroud)

得到<$><*>.

顺便说一句,在其他语言(阿格达,伊德里斯)中,有一个称为成语括号的辛辣符号,这使得这样的事情非常好.如果我们在GHC中使用它们,我们可以像这样编写这个代码(这只是上面代码的符号):

p <- (| Person (newIORef "Boston") (newIORef 100) |)
Run Code Online (Sandbox Code Playgroud)

哪一个人可能认为会带来更好的代码.