2017-01-28 48 views
2

使用IO單子輸出這是我在做什麼:如何飛

data Person = Person (IORef String) (IORef Int) 
name <- newIORef "Boston" 
age <- newIORef 100 
p = Person name age 

我想知道如果我可以把它們放在一個線,如:

p = Person (newIORef "Boston") (newIORef (100::Int)) 

有什麼辦法把他們放在一條線上?

+0

請編輯您的問題,以便語法正確(您可能打算在第一段代碼中使用do-block)。 – duplode

+1

@duplode,公平起見,這是一個有效的ghci會話 – luqui

+0

@luqui這確實有道理。從現在開始閱讀問題時,我會牢記這一點:) – duplode

回答

7

您可以使用IO實例Applicative

p <- Person <$> newIORef "Boston" <*> newIORef 100 

如果您使用的base舊版本,您可能需要

import Control.Applicative 

得到<$><*>

另一方面,在其他語言(Agda,Idris)中,有一種叫做idiom brackets的辛辣符號,它使得諸如此類的事情變得非常好。如果我們在GHC有他們,我們可以寫這樣的代碼,而不是(這只是上面的代碼符號):

p <- (| Person (newIORef "Boston") (newIORef 100) |) 

哪一個會思考導致更好的代碼。