Можно ли сделать вывод в нотации do, а затем вернуть строку в haskell? - PullRequest
0 голосов
/ 24 апреля 2011

возможно ли в haskell заставить некоторые операции выводить данные в реальном времени, а затем возвращать строку с функцией, подобной:

test :: String -> String
test x = do
    putStrLn x
    -- make some stuff
    return "abc"

1 Ответ

3 голосов
/ 24 апреля 2011

Да, это так. Но тогда ваша функция 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, выводит первый аргумент, а затем возвращает второй. Это часто полезно, если вы пишете сложную программу и хотите убедиться, что она работает. Но будьте осторожны: вы не можете предсказать, когда сообщение напечатано или распечатано. Это может появиться один раз дважды или не появляться вообще, в зависимости от настроения компиляторов.

...