Каждая другая монада поставляется с версией преобразователя, и, насколько я знаю, идея преобразователя является общим расширением монад. Следуя тому, как строятся другие трансформаторы, IOT
будет что-то вроде
newtype IOT m a = IOT { runIOT :: m (IO a) }
для которых я мог бы создавать полезные приложения на месте: IOT Maybe
может либо выполнять действие ввода-вывода, либо ничего не делать, IOT []
может создавать список, который впоследствии может быть sequence
d.
Так почему же в Haskell нет преобразователя ввода-вывода?
(Примечания: я видел этот пост в Haskell Cafe, но не могу понять этого. Кроме того, на странице" Взлом "преобразователя ST упоминается, возможно, связанная проблема в своем описании, но не предлагает никаких подробностей.)
runIO
функции (конечно, без учета unsafePerformIO) ... - person stephen tetley   schedule 24.10.2012m a -> a
, поэтому я не понимаю, как это вообще связано. (Внутреннее устройство bind может быть сколь угодно небезопасным, если интерфейс чистый.) - person David   schedule 24.10.2012runIO
, потому что вы не можете запустить побочный код, чтобы получить чистый ответ. Точно так же нет оправдания для IOT, потому что нет монады, к которой вы могли бы разумно добавить эффекты IO. В стеке монад ввод-вывод должен быть самой внутренней монадой - вы можете добавлять к нему другие монадические эффекты, но не наоборот. - person stephen tetley   schedule 25.10.2012IOT
без (разумной) внутренней развёртки каждый раз, когда вы используете связывание, что приводит к непредсказуемому поведению? (Если да, возможно, дайте полный ответ) - person David   schedule 25.10.2012runIOT (launchMissiles >> lift [])
оценивать? - person is7s   schedule 25.10.2012IOT
невозможно. - person Joachim Breitner   schedule 25.10.2012