Использовать именованные экземпляры для других экземпляров

Я пытаюсь создать экземпляр Semigroup и VerifiedSemigroup в моем пользовательском типе Bool как на операторе &&, так и на операторе ||:

%case data Lógico = Cierto | Falso

(&&) : Lógico -> Lógico -> Lógico
(&&) Cierto Cierto = Cierto
(&&) _ _ = Falso

(||) : Lógico -> Lógico -> Lógico
(||) Falso Falso = Falso
(||) _ _ = Cierto

Итак, сначала создаю именованный экземпляр для Semigroup над оператором &&:

-- Todos
instance [TodosSemigroup] Semigroup Lógico where
    (<+>) a b = a && b

Но когда вы делаете экземпляр VerifiedSemigroup, как я могу сказать Idris использовать экземпляр TodosSemigroup Lógico?

instance [TodosVerifiedSemigroup] VerifiedSemigroup Lógico where
    semigroupOpIsAssociative l c r = ?vsemigroupTodos

Этот код дает мне следующую ошибку:

При разработке типа Prelude.Algebra.Main.TodosVerifiedSemigroup, метод semigroupOpIsAssociative: Не удается разрешить класс типа Semigroup Lógico

Ответ 1

Появился новый механизм для этого с ключевым словом using:

%case data Lógico = Cierto | Falso

(&&) : Lógico -> Lógico -> Lógico
(&&) Cierto Cierto = Cierto
(&&) _ _ = Falso

(||) : Lógico -> Lógico -> Lógico
(||) Falso Falso = Falso
(||) _ _ = Cierto

instance [TodosSemigroup] Semigroup Lógico where
    (<+>) a b = a && b

instance [TodosVerifiedSemigroup] VerifiedSemigroup Lógico using  where
    semigroupOpIsAssociative l c r = ?vsemigroupTodos

Ответ 2

В репозитории idris-dev существует открытая проблема. Эдвин Брэди утверждает, что

В настоящее время (по дизайну) именованные экземпляры могут использоваться только для разрешения класса путем явного указания имени, даже если нормальный экземпляр отсутствует.

Итак, у нас есть Idris, пытающийся разрешить экземпляр unnamed Semigroup Lógico, который необходим для определения экземпляра VerifiedSemigroup Lógico.

Нам нужно каким-то образом указать в объявлении экземпляра, что именованный экземпляр должен использоваться для ограничения ограничения класса. Я не знаю, возможно ли это. Цитата Эдвина из связанной проблемы:

это поведение не документировано нигде