Оценка IO
Действие ничего не делает. Это верно!
Если вам нравится, значения IO
являются просто «инструкциями». Итак, все, что вы делаете с этим seq
, заставляет программу быть уверенной в том, что of должно быть выполнено, если действовало фактически . И использование действия не имеет никакого отношения к оценке, это означает монадически привязав его к вызову main
. Но поскольку, как вы говорите, someFunction
является функцией с неравномерной подписью, которая не может произойти здесь.
Что вы можете сделать ... но не, является
import Foreign
someFunction x = unsafePerformIO (print x) `seq` 1
это на самом деле пар оценка IO
исполнения. Что обычно является плохой идеей в Haskell, поскольку оценка может произойти в совершенно непредвиденном порядке, возможно, в разное количество раз, чем вы думаете (потому что компилятор предполагает ссылочную прозрачность) и других сценариев хаоса.
Правильное решение изменить подпись монадическими:
someFunction :: Int -> IO Int
someFunction x = do
print x
return 1
main = do
y <- someFunction "test"
print y
И, как это происходит, программа, как уверен, насколько это возможно в любом случае, даже без seq
. Выполнение действия можно получить только с помощью более подробной информации.
Оценка операции ввода-вывода не совпадает с ее выполнением. Нет никакого способа сделать someFunction делать то, что вы хотите, потому что если вы хотите использовать 'print' в нем, он должен быть в монаде IO, и вы не сможете распечатать его результат (без изменения основного). – fjh
Интересно, почему нижняя сторона? Я верю, что мой вопрос - вполне правильный вопрос. – Bakuriu