как помириться с IO
Nov. 27th, 2012 08:28 amОказывается, не так просто отказаться от ООП мировосприятия. Что больше всего раздражало, так это отсутствие у IO всяких "getter и setter". Нет, ну, правда: как может что-то заниматься полезным вычислением, если ему нельзя ничего set и даже нельзя ничего get? Как можно общаться с функциями, результат которых (IO a), если потом "из" (IO a) ничего нельзя вынуть?
А вот и не нужно ничего ниоткуда вынимать! Нужно этому IO сказать, что делать! А как же результат, даже результат не отдаст? Дык, не отдаст, если не вам это положено. Односторонняя такая связь. Асинхронная? Асинхронная!
Вот именно, что List да Maybe преподносятся таким образом, будто это контейнеры с удобными ручками. Если рассматривать с т.з. ООП, то чуда особенно и не видно. Ну, контейнер, ну, структура у него private и никак извне не доступна, ну, параметризовали эту private часть "генериком" - эка невидаль. А вот нифига это не контейнеры.
Если хотите, у IO всё настолько private, что нельзя узнать вообще ничего. И тем не менее, можно задать собственные вычисления. Просто нужно перестать думать "дай x, дай y, я тебе верну x*y", а нужно думать "возьми x, возьми y, и вычисли x*y". И нужно перестать думать, куда результат денется - за ним придут.
А вот и не нужно ничего ниоткуда вынимать! Нужно этому IO сказать, что делать! А как же результат, даже результат не отдаст? Дык, не отдаст, если не вам это положено. Односторонняя такая связь. Асинхронная? Асинхронная!
Вот именно, что List да Maybe преподносятся таким образом, будто это контейнеры с удобными ручками. Если рассматривать с т.з. ООП, то чуда особенно и не видно. Ну, контейнер, ну, структура у него private и никак извне не доступна, ну, параметризовали эту private часть "генериком" - эка невидаль. А вот нифига это не контейнеры.
Если хотите, у IO всё настолько private, что нельзя узнать вообще ничего. И тем не менее, можно задать собственные вычисления. Просто нужно перестать думать "дай x, дай y, я тебе верну x*y", а нужно думать "возьми x, возьми y, и вычисли x*y". И нужно перестать думать, куда результат денется - за ним придут.
do x <- xs return $ f x- это совсем не "get x из xs, set f x". Это "у вас там внутри есть x, так примените к нему f". x в данном месте всего-лишь placeholder аргумента, чтобы был ясен его тип и происхождение. Потому как у IO нет способа get x из xs. Есть только способ завернуть в монаду f.