поскольку монады не коммутируют
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)
no subject
Date: 2012-11-27 12:52 am (UTC)Вот дописал до конца, начинает быть понятно, как именно f отображено монадой. А самое главное, пока не напишешь вот такую вот штуковину, где две монады сразу, самая крутизна системы типов остаётся за кадром.
no subject
Date: 2013-01-14 06:13 pm (UTC)Ну, когда нужно сделать одну бинарную функцию на типах монадой по двум аргументам, например.
no subject
Date: 2013-01-14 07:14 pm (UTC)no subject
Date: 2013-01-15 06:16 pm (UTC)