2013-02-23 72 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