将命名实例用于其他实例

cha*_*ni2 11 formal-verification named-instance typeclass idris semigroup

我正在尝试在运算符和运算符上为我的自定义数据类型创建一个SemigroupVerifiedSemigroup实例: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
Run Code Online (Sandbox Code Playgroud)

所以我先制作一个命名实例Semigroup&&运营商:

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

但在制作VerifiedSemigroup实例时,如何告诉Idris使用TodosSemigroup实例Lógico

instance [TodosVerifiedSemigroup] VerifiedSemigroup Lógico where
    semigroupOpIsAssociative l c r = ?vsemigroupTodos
Run Code Online (Sandbox Code Playgroud)

该代码给我以下错误:

在详细说明类型时Prelude.Algebra.Main.TodosVerifiedSemigroup,方法semigroupOpIsAssociative:无法解析类型类Semigroup Lógico

cha*_*ni2 1

为此有一个新引入的机制,其中包含using关键字:

\n
%case data L\xc3\xb3gico = Cierto | Falso\n\n(&&) : L\xc3\xb3gico -> L\xc3\xb3gico -> L\xc3\xb3gico\n(&&) Cierto Cierto = Cierto\n(&&) _ _ = Falso\n\n(||) : L\xc3\xb3gico -> L\xc3\xb3gico -> L\xc3\xb3gico\n(||) Falso Falso = Falso\n(||) _ _ = Cierto\n\ninstance [TodosSemigroup] Semigroup L\xc3\xb3gico where\n    (<+>) a b = a && b\n\ninstance [TodosVerifiedSemigroup] VerifiedSemigroup L\xc3\xb3gico using TodosSemigroup where\n    semigroupOpIsAssociative l c r = ?vsemigroupTodos\n
Run Code Online (Sandbox Code Playgroud)\n