2013-12-01 4 views
0

Сейчас я изучаю haskell. Теперь я хочу написать функцию, которая принимает один аргумент (например, Int), печатает некоторую строку на выходе и возвращает этот аргумент. Я пытаюсь сделать что-то вроде этого:Функция Haskell, которая принимает один аргумент и выводит строку на вывод

test :: Int -> Int 
test h = do 
     putStrLn "Here will be number!" 
     h 

main = print $ test 200 

Теперь я получаю такую ​​ошибку:

Couldn't match expected type `Int' with actual type `m0 b0' 
Expected type: m0 a0 -> m0 b0 -> Int 
    Actual type: m0 a0 -> m0 b0 -> m0 b0 
In a stmt of a 'do' block: h 
In the expression: 
    do { putStrLn "Here will be number!"; 
     h } 

Есть ли способ осуществить то, что я хочу?

+0

Обратите внимание, что технически существует нечто, называемое 'unsafePerformIO', которое позволит вам сделать это с помощью подписи, которую вы указали. Но поверьте мне, что вам лучше забыть о том, что он существует в течение следующих нескольких месяцев, пока вы не поймете, как работает Haskell, и почему вы не собираетесь использовать эту «функцию» очень часто. Подсказка: это имеет какое-то отношение к тому, что на самом деле это не функция. – Cubic

+0

Как вы можете получить 'h' * before *' putStrLn' в сообщении об ошибке, когда вы получили 'h' * после *' putStrLn' в коде? – md2perpe

+0

@ md2perpe отредактирован (это было из моих экспериментов с кодом) –

ответ

4

Поскольку тест производит выходные данные, видимые пользователю, он должен вернуть IO Int, а не Int. Посмотрите на introduction to IO на вики Haskell.

0
test :: Int -> IO() 
test n = putStrLn (show n) 

main :: IO() 
main = test 200 
+2

Обратите внимание, что 'test' =' print'. – kqr

+0

Спасибо. Раньше не видел 'print'. http://hackage.haskell.org/package/base-4.6.0.1/docs/src/System-IO.html#print – md2perpe

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