Да, это так. Но тогда ваша функция test
тоже должна быть функцией IO
. Так что вместо этого вы должны написать test :: String -> IO String
как тип. Кроме того, использование отличается тогда. Сначала нужно «развернуть» значение:
-- instead of
if (test string == "abc") then ...
-- you have to write
do string' <- test string -- unwrap
if (string' == "abc") then ...
Я могу понять, что иногда возникает необходимость напечатать отладочное сообщение где-то глубоко внутри чистого вычисления. Для этого специального случая есть функция trace
из Debug.Trace
. Он имеет тип trace :: String -> a -> a
, выводит первый аргумент, а затем возвращает второй. Это часто полезно, если вы пишете сложную программу и хотите убедиться, что она работает. Но будьте осторожны: вы не можете предсказать, когда сообщение напечатано или распечатано. Это может появиться один раз дважды или не появляться вообще, в зависимости от настроения компиляторов.