Мне очень понравились возражения против implicit parameters, которые обсуждались в статье Functional Pearl: Implicit Configurations Киселева и Шаня.Являются ли неявные параметры трудными для встраивания в GHC?
Это не звук встроенного кода (β-сокращение) при наличии неявных параметров.
Действительно? Я бы ожидал, что GHC должен встроить в ту же область, что и переданный неявный параметр, нет?
Я считаю, что я понимаю их возражение, что:
поведение термина может измениться, если его подпись добавляется, удаляется, или изменен.
документация пользователя GHC объясняет, что программисты должны заботиться вокруг polymorphic recursion и monomorphism restriction. Это как-то то, что они подразумевают под проблемой для встраивания?
Я предполагаю, что этот пример полиморфной рекурсии охватывает то, что они означают, «обобщая также неявные параметры»? Что-нибудь еще?
Является ли класс ReifiesStorable
от Data.Reflection действительно разумным решением этих трудностей? По-видимому, он десериализует всю неявную структуру данных каждый раз, когда к ней обращаются, что звучит катастрофично для производительности. Мы могли бы, например, хотим, чтобы наша неявная информация была таблицей или таблицей Cayley, которая занимает концерт ram и должна иметь доступ во время миллионов алгебраических операций.
Возможно ли какое-либо лучшее решение, использующее неявные параметры, или другой метод, который компилятор может легко оптимизировать, за кадром, сохраняя при этом еще больше через систему типов, используя потоки состояний или что-то еще?
Ahh sweet, поэтому 'Data.Reflection' - это все черная магия. :) Есть ли какой-нибудь код или статьи, которые вы рекомендуете читать? «Data.Reflection» уже имеет смысл теперь, когда я замечаю каталог примеров. Однако я должен прочитать другую информацию о Data.Tagged и Data.Proxy. –