11

Я пытаюсь сделать экземпляр 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, как я могу рассказать Идрису использовать пример TodosSemigroupLógico?

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

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

When elaborating type of Prelude.Algebra.Main.TodosVerifiedSemigroup , method semigroupOpIsAssociative : Can't resolve type class Semigroup Lógico

+0

@dfeuer, я думаю, что проблема в том, что не будет реализован. – chamini2

ответ

0

Был вновь введен механизм для этого с 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

Там является open issue в хранилище Идрис-Dev. Edwin Brady утверждает, что

Currently (by design) named instances can only be used to resolve a class by being named explicitly, even if there is no normal instance.

Так вот мы Идрис пытается разрешить неназванный Semigroup Lógico экземпляр, который необходим для того, чтобы определить VerifiedSemigroup Lógico экземпляр.

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

this behaviour isn't documented anywhere

+0

Ну, да, я знаю, что это проблема. Мне нужно знать, как я могу проверить экземпляр VerifiedSemigroup на использование ранее определенного экземпляра Semigroup. – chamini2

Смежные вопросы