При существующем положении вещей IO
-специфичное поведение основывается на том, что IO
действия немного похожи на состояние и не могут быть восстановлены. Так что вы можете сказать что-то вроде
s <- readFile "foo.txt"
и получите фактическое значение s :: String
.
Совершенно очевидно, что для поддержания такого рода взаимодействия требуется нечто большее, чем просто Monad
. Это было бы не так просто с
n <- [1, 2, 3]
, чтобы сказать, что значение n имеет.
Можно, конечно, представить себе адаптацию ghci для открытия подсказки, позволяющей создавать монадические вычисления в стиле do
во множественных взаимодействиях командной строки, обеспечивая выполнение всех вычислений при закрытии подсказки. Непонятно, что значит проверять промежуточные значения (кроме генерации коллекций печатных вычислений типа m (IO ())
, для активной монады m
, конечно).
Но было бы интересно спросить, можно ли выделить и обобщить то, что особенного в IO
, которое делает возможным хорошее интерактивное поведение подсказок. Я не могу удержаться от того, чтобы нюхать комонадный рассказ о ценности в контексте о взаимодействии в приглашении, но я еще не отследил его. Можно было бы подумать о том, чтобы обратиться к моему примеру со списком, рассматривая, что будет означать курсор в пространстве возможных значений, в то время как IO
имеет курсор, наложенный на него здесь и сейчас реальный мир. Спасибо за пищу для размышлений.