Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
a -> b -> () не может (не должен) иметь побочных эффектов, что бы он там ни принималmapOI, которая примет функцию f :: OI a -> b, а вернёт f :: OI (OI a) -> OI bf теперь как бы принимает копию окружения и возвращает новую. Но ведь f сам ничего не возвращает, а mapIO ничего не знает об f, следовательно реализация mapOI может разве что скопировать окружение.OI a -> b, не эстетичноIO a имеет вполне понятный смысл — вычисление значения типа a, чего не сказать об OI a -> bState с трудом представляю, как менять этот самый State из функции, а не снаружи при помощи специально написанной local, потому что duplicate всего лишь копирует (о чём я в пункте 2 написал).В случае с OI будет то же самоеА как же тогда осуществлять побочные эффекты?
Вообще, почему-то в Хаскеле монады определяются через return и bind, а не через return, fmap и joinДумаю, в немалой степени из-за do-notation. Там напрямую используются
>>= и >>, а так будут лишние действия. Хотя не знаю, будет ли через fmap/join медленнее.А помоему, довольно понятно: OI Handle -> Char это функция, которая возвращает Char из файла. Это скорее «по-другому» (а так — вполне эстетично).Я тоже об этом подумал :)
getChars :: OI Handle -> OI Handle -> (Char, Char)
Возвращает (Char, Char) из двух файлов, а это не так.OI a обязан быть последним аргументом.getChars f1 f2 = (getChar f1, getChar f2), но как этот getChars в cobind передать?Не понял вопроса. :( Во время вычисления coeval разве не будут производиться side-effecting операции?
IO воспринимается, как World -> (a, World). Т.о. хотя мы в сам World залезть не можем, реализация — может, и putChar можно написать так:putChar c w@(World (Heap h) ... (Descriptors d)) = case lookup d stdout of
Just f -> Success ((), World (replaceInHeap h f c) ... (Descriptors d))
Nothing -> Exception "hmm..." ((), w)
enableOI, который дублирует окружение, а затем mapOI, который из функции OI Handle -> CharOI (OI Handle) -> OI Charco-ext f allows a function f, which accepts arguments that may depend upon the current IO environment, to propagate the IO environment as an implicit parameter along with its result»co-ext f = (mapOI f).enableOIputChar должен бы иметь тип OI (OI Char) -> OI () и использоваться без mapOI, но тогда неясно, как его использовать внутри своих функций.Handle может внутри себя содержать все нужные данные (т.е. это не дескриптор, а сами данные), тогда coeval stdin возвращает некоторые данные, а также может выполнить некоторые изменения в окружении (что за изменения — скрыто в реализации OI), а getChar, зная внутреннее устройство Handle достаёт оттуда символ.main будет иметь тип coMain :: OI () -> ()coMain env = env =>> coGetChar stdin =>> coPutChar stdout
Вступление