2013-02-23 110 views
3

我能寫一個函數執行IO作爲它的一個副作用嗎?例如:IO作爲副作用

f :: Int -> Int 
f n = putStr "text" >> return n*2 

很顯然,我沒有任何的方式來寫,沒有它被完全不正確的代碼,但應該至少說明大致就是我希望做。

+0

你的意思是沒有結果類型是'IO Int'? – sepp2k 2013-02-23 17:38:40

+0

其實這是一個非常好的功能 - 它只是類型'Int - > IO Int',這是一件好事。你的問題是什麼? – delnan 2013-02-23 17:41:41

+0

禁止你想要的是'IO' monad的*特性*。你可以用'unsafePerformIO'作弊,但它不會做你想要的。將簽名更改爲'Int - > IO Int',你會沒事的。 – gspr 2013-02-23 17:43:34

回答

11

你的功能幾乎是正確的。如果它有副作用,那麼它需要類型IO。此外,功能應用程序綁定比中綴更緊密。將這些結果修正爲:

f :: Int -> IO Int 
f n = putStr "text" >> return (n*2) 
+0

我太親近了!感謝大家的幫助。 – Allan 2013-02-23 17:46:21

+0

@Allan歡迎來到StackOverflow!如果托馬斯的答案回答你的問題,你的總滿意度,請*接受*通過點擊左邊的複選標記。如果你還沒有這樣做,請點擊左邊的向上箭頭,*點擊它。 – dave4420 2013-02-23 17:51:26

+5

@ dave4420 Upvoting需要15位代表,OP需要一些他(她)自己可以upvote之前提高自己。 – 2013-02-23 18:58:02