[personal profile] sassa_nf
кого вкладывать внутрь?

Упражнение: ну, все монады уже давно написаны, поэтому пишем через 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)

Date: 2012-11-23 10:13 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Интересно, если кто-то знает ответ. У меня такое ощущение, что мы вот нащупали проблему, но что с ней делать, пока совсем неочевидно.

В широком смысле - правильно писать код не умеет почти никто. Ну, может быть, okmij.

Date: 2012-11-26 09:07 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
Допустим, в общем-то случае они не коммутируют, а в случаях, когда таки да, с практической т.з. разница есть, кого вовнутрь?

Date: 2012-11-26 02:56 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Есть разница; я тут собираюсь пример выкатить.

Date: 2012-11-27 12:52 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
о, хорошо бы.

Вот дописал до конца, начинает быть понятно, как именно f отображено монадой. А самое главное, пока не напишешь вот такую вот штуковину, где две монады сразу, самая крутизна системы типов остаётся за кадром.

Date: 2013-01-14 06:13 pm (UTC)
From: [identity profile] udpn.livejournal.com
А с отсутствием type-level lambda ещё не встречался?

Ну, когда нужно сделать одну бинарную функцию на типах монадой по двум аргументам, например.

Date: 2013-01-14 07:14 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
интересно. А как это выглядит?

Date: 2013-01-15 06:16 pm (UTC)
From: [identity profile] udpn.livejournal.com
Так как я в очередной раз не смог найти, где у меня попадалась эта гадость (видимо, я просто переписал код), я попытаюсь оправдаться постом в ЖЖ :)
Page generated May. 22nd, 2026 03:13 am
Powered by Dreamwidth Studios