Допустим, у меня есть класс типов с несколькими параметрами:
class B b => C a b | a -> b where
getB :: a -> (T, b)
Тогда я хочу функцию:
f :: C a b => a -> c
f = g . getB
, которая использует другую функцию g :: B b => (T, b) -> c
и getB
, поэтому необходим экземпляр C a b
.
(Отказ от ответственности: реальная проблема гораздо сложнее, вышеупомянутая является лишь упрощенной версией.)
Проблема в том, что с учетом функциональной зависимости C a b | a -> b
мы знаем, что b
может быть полностью решен a
, поэтому теоретически я должен иметь возможность не упоминать b
в типе f
( поскольку он используется не в другом месте, а в экземпляре C a b
), но я не нашел способа достичь этого.
Также обратите внимание, что из-за существования ограничения B b
в классе C
, я думаю, что я не могу вместо этого использовать расширение TypeFamilies, так как синтаксис этого не оставляет ничего для ограничения типа B b
для жизни.
Так есть ли способ скрыть детали реализации (нерелевантный параметр типа b
) от пользователя этой функции f
?