2013-02-23 5 views
3

Могу ли я написать функцию, выполняющую IO в качестве побочного эффекта? Например:IO как побочный эффект

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

Очевидно, у меня нет какой-либо способ, чтобы написать этот код без его совершенно неправильно, но это должно по крайней мере показать примерно то, что я ищу делать.

+0

Вы имеете в виду, что без результата типа 'IO Int'? – sepp2k

+0

На самом деле это совершенно прекрасная функция - у нее просто есть тип Int -> IO Int', и это хорошо. Какая у вас проблема? – delnan

+0

Запрет того, что вы хотите, - это * функция * монады IO. Вы можете обманывать 'unsafePerformIO', но он не будет делать то, что вы хотите здесь. Измените подпись на 'Int -> IO Int', и все будет в порядке. – gspr

ответ

11

Ваша функция почти права. Если он имеет побочный эффект, то ему нужен тип IO. Кроме того, приложение-приложение привязывается к инфиксу. Исправление этих результатов:

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

Я был так близок! Спасибо всем за помощь. – Allan

+0

@Allan Добро пожаловать в StackOverflow! Если ответ Томаса ответит на ваш вопрос на ваше полное удовлетворение, тогда пожалуйста * примите * его, нажав галочку слева. И если вы этого еще не сделали, пожалуйста, также * повысьте * его, нажав стрелку вверх слева. – dave4420

+5

@ dave4420 Upvoting требует 15 rep, OP нуждается в еще нескольких оборотах его (ее) себя, прежде чем он сможет взломать. –

Смежные вопросы