поскольку монады не коммутируют
Nov. 23rd, 2012 09:58 pmкого вкладывать внутрь?
Упражнение: ну, все монады уже давно написаны, поэтому пишем через FFI работу с консолью. Техническая часть работает, там всего-то десяток интересных однострочных функций, но теперь бы оформить правильно, то есть состояние консоли завернуть в монаду reader-writer-state.
Поскольку все обращения к FFI возвращают тип (IO a), нужно правильно коммутировать Console и IO.
Например, можно так:
data Console a = Console (ForeignPtr ConsoleStructRaw) (IO a)
openConsole :: Console a
а можно так:
data Console a = Console (ForeignPtr ConsoleStructRaw) a
openConsole :: IO (Console a)
Дык, как правильнее? С моей дилетантской т.з. кажется первое, хотя проще пишется второе.
Ну, и чтоб два раза не вставать: FFI пользуется типами вроде CInt; имеет ли смысл CInt тут на месте перекрутить в Int (например, чтобы потом компилятор не рассказывал, что я не могу сравнивать координату консоли x и 0)
Упражнение: ну, все монады уже давно написаны, поэтому пишем через FFI работу с консолью. Техническая часть работает, там всего-то десяток интересных однострочных функций, но теперь бы оформить правильно, то есть состояние консоли завернуть в монаду reader-writer-state.
Поскольку все обращения к FFI возвращают тип (IO a), нужно правильно коммутировать Console и IO.
Например, можно так:
data Console a = Console (ForeignPtr ConsoleStructRaw) (IO a)
openConsole :: Console a
а можно так:
data Console a = Console (ForeignPtr ConsoleStructRaw) a
openConsole :: IO (Console a)
Дык, как правильнее? С моей дилетантской т.з. кажется первое, хотя проще пишется второе.
Ну, и чтоб два раза не вставать: FFI пользуется типами вроде CInt; имеет ли смысл CInt тут на месте перекрутить в Int (например, чтобы потом компилятор не рассказывал, что я не могу сравнивать координату консоли x и 0)