Да, как решение изначально напрашивалось вернуть из функции результат print. Но это выглядело бы очень странно, тем более что нужно было бы возвращать все результаты IO операций и мало ли каких еще эффектов из функции.
1. Выходит, что пометка возвращаемого результата как IO, это синт. сахар, который скажет интерпретатору найти все IO операции в функции и выполнить их?
2. Правда тут еще возникает вопрос о порядке выполнения, т.к. при IO это может быть важно, но об этом насколько я понял заботится do.
3. В итоге если бы мы все же хотели заменить вызов функции ее результатом, то поскольку теперь тип возвращаемого значения не int, а IO int, мы, без нарушения этого контракта, не смогли бы просто заменить его на 120, но были бы вынуждены как и интерпретатор понять, какой именно IO эффект порождается функцией и добавить его как результат работы к значению 120? (в этом объяснении есть ощущение что я что-то упускаю или очень упрощаю, но по-другому свести все вместе как-то не получалось :))
Надеюсь я не пропустил этого в комментах, но есть вопрос.
В первом примере есть вывод в лог (условный print из последнего примера), и мы считаем, что программа написана не в стиле ФП, потому что если заменить Factorial(5) на 120, у нас перестанет выводиться в лог сообщение.
Собственно вопрос в — а чем бы отличалось поведение программы, если вместо вывода в лог была бы функция с print (как в haskell из последнего примера) и грязный интерпретатор?
Мне кажется замени мы в этом случае вызов функции факториала на ее значение, мы все еще потеряли бы вывод в лог/консоль сообщения.
1. Выходит, что пометка возвращаемого результата как IO, это синт. сахар, который скажет интерпретатору найти все IO операции в функции и выполнить их?
2. Правда тут еще возникает вопрос о порядке выполнения, т.к. при IO это может быть важно, но об этом насколько я понял заботится do.
3. В итоге если бы мы все же хотели заменить вызов функции ее результатом, то поскольку теперь тип возвращаемого значения не int, а IO int, мы, без нарушения этого контракта, не смогли бы просто заменить его на 120, но были бы вынуждены как и интерпретатор понять, какой именно IO эффект порождается функцией и добавить его как результат работы к значению 120? (в этом объяснении есть ощущение что я что-то упускаю или очень упрощаю, но по-другому свести все вместе как-то не получалось :))
В первом примере есть вывод в лог (условный print из последнего примера), и мы считаем, что программа написана не в стиле ФП, потому что если заменить Factorial(5) на 120, у нас перестанет выводиться в лог сообщение.
Собственно вопрос в — а чем бы отличалось поведение программы, если вместо вывода в лог была бы функция с print (как в haskell из последнего примера) и грязный интерпретатор?
Мне кажется замени мы в этом случае вызов функции факториала на ее значение, мы все еще потеряли бы вывод в лог/консоль сообщения.