Сейчас я изучаю 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 }
Есть ли способ осуществить то, что я хочу?
Обратите внимание, что технически существует нечто, называемое 'unsafePerformIO', которое позволит вам сделать это с помощью подписи, которую вы указали. Но поверьте мне, что вам лучше забыть о том, что он существует в течение следующих нескольких месяцев, пока вы не поймете, как работает Haskell, и почему вы не собираетесь использовать эту «функцию» очень часто. Подсказка: это имеет какое-то отношение к тому, что на самом деле это не функция. – Cubic
Как вы можете получить 'h' * before *' putStrLn' в сообщении об ошибке, когда вы получили 'h' * после *' putStrLn' в коде? – md2perpe
@ md2perpe отредактирован (это было из моих экспериментов с кодом) –