11

Sto cercando di fare un esempio Semigroup e VerifiedSemigroup sul mia abitudine Bool tipo di dati sia dell'operatore && e operatore ||:Utilizzare chiamato istanze per altri casi

%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 

Così ho prima fanno una istanza denominata per Semigroup il && dell'operatore:

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

Tuttavia, quando si crea l'istanza VerifiedSemigroup, come si dice a Idris di utilizzare l'istanza di Lógico?

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

Questo codice mi dà il seguente errore:

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

+0

@dfeuer, penso che il problema è che non è implementata. – chamini2

risposta

0

C'era un meccanismo di nuova introduzione per questo la parola 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

C'è un open issue al repository Idris-dev. Edwin Brady afferma che

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

Quindi qui abbiamo Idris provare a risolvere il senza nome Semigroup Lógico esempio, che è necessaria al fine di definire un'istanza VerifiedSemigroup Lógico.

Abbiamo bisogno di un modo per specificare, nella dichiarazione di istanza, che un'istanza denominata deve essere utilizzata per soddisfare un vincolo di classe. Non so se sia possibile. Citando Edwin dalla questione legata:

this behaviour isn't documented anywhere

+0

Beh, sì, so che questo è il problema. Quello che devo sapere è come posso dire all'istanza di VerifiedSemigroup di usare l'istanza Semigroup precedentemente definita. – chamini2