История изменений
Исправление quasimoto, (текущая версия) :
В do { x <- GetTime; y <- GetTime; SetTime (y - x) } GetTime чисто добывает всегда один и тот же генератор времени (генератор, то есть канал на выход всегда один, данные в нём нас не интересуют), (>>=) чисто отправляет выхлоп генератора на вход другого действия, локально очищая его, то есть для одних и тех же генераторов (каналов на выход) и действий берущих выхлоп (каналов со входом и выходом) составляет одни и те же генераторы (как схему из таких каналов в виде очевидной композиции), SetTime для разных времён (как чистых функций от того что у нас доступно от входов текущих действий — они уже локально очищены) чисто возвращает один и тот же сеттер (именно этого) времени (то есть нечто только со входом, приёмник). Или иначе говоря, конфигурация каналов данных чистая (генераторы, приёмники, композиции — (>>=) это \m f -> (const m >=> f) () где (>=>) это композиция в Kleisli категории функций из очищенных входов в генераторы, сама такая композиция проводит очищение по мере своей работы, это нужно чтобы держать неизвестные данные в одном монадическом слое, не выпускать их наружу, но уметь обрабатывать их с помощью чистых функций), сами данные могут быть любыми, дальше, на уровне ниже чистого языка, всё это можно интерпретировать обычно — SetTime и GetTime это обычные императивные функции с эффектами, >>= это создание окружения и ;, ну и все чистые вычисления при этом надо проводить.
Разумеется, это я всё только что придумал, но это нормально для хаскеля — каждый раз придумывать семантику IO :)
Исправление quasimoto, :
В do { x <- GetTime; y <- GetTime; SetTime (y - x) } GetTime чисто добывает всегда один и тот же генератор времени (генератор, то есть канал на выход всегда один, данные в нём нас не интересуют), (>>=) чисто отправляет выхлоп генератора на вход другого действия, локально очищая его, то есть для одних и тех же генераторов (каналов на выход) и действий берущих выхлоп (каналов со входом и выходом) составляет одни и те же генераторы (как схему их таких каналов в виде очевидной композиции), SetTime для разных времён (как чистых функций от того что у нас доступно от входов текущих действий — они уже локально очищены) чисто возвращает один и тот же сеттер (именно этого) времени (то есть нечто только со входом, приёмник). Или иначе говоря, конфигурация каналов данных чистая (генераторы, приёмники, композиции — (>>=) это \m f -> (const m >=> f) () где (>=>) это композиция в Kleisli категории функций из очищенных входов в генераторы, сама такая композиция проводит очищение по мере своей работы, это нужно чтобы держать неизвестные данные в одном монадическом слое, не выпускать их наружу, но уметь обрабатывать их с помощью чистых функций), сами данные могут быть любыми, дальше, на уровне ниже чистого языка, всё это можно интерпретировать обычно — SetTime и GetTime это обычные императивные функции с эффектами, >>= это создание окружения и ;, ну и все чистые вычисления при этом надо проводить.
Разумеется, это я всё только что придумал, но это нормально для хаскеля — каждый раз придумывать семантику IO :)
Исправление quasimoto, :
В do { x <- GetTime; y <- GetTime; SetTime (y - x) } GetTime чисто добывает всегда один и тот же генератор времени (генератор, то есть канал на выход всегда один, данные в нём нас не интересуют), (>>=) чисто отправляет выхлоп генератора на вход другого действия, локально очищая его, то есть для одних и тех же генераторов (каналов на выход) и действий берущих выхлоп (каналов со входом и выходом) составляет одни и те же генераторы (как схему их таких каналов в виде очевидной композиции), SetTime для разных времён (как чистых функций от того что у нас доступно от входов текущих действий — они уже локально очищены) чисто возвращает один и тот же сеттер (именно этого) времени (то есть нечто только со входом, приёмник). Или иначе говоря, конфигурация каналов данных чистая (генераторы, приёмники, композиции — (>>=) это \m f -> (const m >=> f) () где (>=>) это композиция в Kleisli категории функций из очищенных входов в генераторы, сама такая композиция проводит очищение по мере своей работы, это нужно чтобы держать неизвестные данные в одном монадическом слое, не выпускать их наружу, но уметь обрабатывать их с помощью чистых функций), сами данные могут быть любыми, дальше, на уровне ниже чистого языка, всё это можно интерпретировать обычно — SetTime и GetTime это обычные императивные функции с эффектами, >>= это создание окружения и ;, ну и все частые вычисления при этом надо проводить.
Разумеется, это я всё только что придумал, но это нормально для хаскеля — каждый раз придумывать семантику IO :)
Исходная версия quasimoto, :
В do { x <- GetTime; y <- GetTime; SetTime (y - x) } GetTime чисто добывает всегда один и тот же генератор времени (генератор, то есть канал на выход всегда один, данные в нём нас не интересуют), (>>=) чисто отправляет выхлоп генератора на вход другого действия, локально очищая его, то есть для одних и тех же генераторов (каналов на выход) и действий берущих выхлоп (каналов со входом и выходом) составляет одни и те же генераторы (как схему их таких каналов в виде очевидной композиции), SetTime для разных времён (как чистых функций от того что у нас доступно от входов текущих действий — они уже локально очищены) чисто возвращает один и тот же сеттер (именно этого) времени (то есть нечто только со входом, приёмник). Или иначе говоря, конфигурация каналов данных чистая (генераторы, приёмники, композиции — (>>=) это \m f -> (const m >=> f) () где (>=>) это композиция в Kleisli категории функций из очищенных входов в генераторы), сами данные могут быть любыми, дальше, на уровне ниже чистого языка, всё это можно интерпретировать обычно — SetTime и GetTime это обычные императивные функции с эффектами, >>= это создание окружения и ;, ну и все частые вычисления при этом надо проводить.
Разумеется, это я всё только что придумал, но это нормально для хаскеля — каждый раз придумывать семантику IO :)