Как я должен «создавать команды с неявным контекстом» в GHC GHC - PullRequest
2 голосов
/ 05 февраля 2012

Я знаю, что 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 должна продолжать действовать безопасным для типа образом, просто с новым типом.

1 Ответ

1 голос
/ 10 октября 2012

Неявные параметры являются расширением GHC. Вы можете включить его с помощью :set -XImplicitParams на ghci.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...