Я знаю, что ghci
эффективно работает внутри монады IO
.Первоначально я предполагал, что ghci
может обрабатывать другую монаду или преобразование IO
, но из документации ясно, что это не работает.
Вместо этого я попытался использовать неявные параметры, но ghci
прервал все попытки передать неявный параметр из ghci, за исключением локальной привязки неявного параметра в let .. in
, что совершенно бесполезно.
foo <- meow_for_t "chicken"
bar <- let ?foo = foo in purr "tuna"
, где наш включенный модуль говорит:
purr (Eq t, ?foo :: Foo t) => String -> IO ()
purr s = ...
Я бы ожидал, что один purr "tuna"
должен был бы нормально работать с foo <-
или ?foo <-
или хотя бы let ?foo = foo
sans in
, но ничего не помогло.
Возможно, я мог бы создать глобальные IORef
s, используя такие трюки, как:
foo :: IORef (Foo Sometype)
foo = unsafePerformIO $ newIORef []
, но, очевидно, я бы пожертвовал своим прекрасным полиморфизмом в Foo
.
Каков "правильный способ" создания команды верхнего уровня purr
в ghci
, которая изменяет глобальное состояние ghci
безопасным способом типа?
В идеале, естьдолжно быть другое семейство команд, воссоздающее указанное глобальное состояние с новым типом, после которого точка purr
должна продолжать действовать безопасным для типа образом, просто с новым типом.