Использовать именованные экземпляры для других экземпляров
Я пытаюсь создать экземпляр 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
.
Нам нужно каким-то образом указать в объявлении экземпляра, что именованный экземпляр должен использоваться для ограничения ограничения класса. Я не знаю, возможно ли это. Цитата Эдвина из связанной проблемы:
это поведение не документировано нигде