将命名实例用于其他实例

时间:2015-02-01 20:42:22

标签: typeclass idris formal-verification named-instance semigroup

我尝试在运营商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的{​​{1}}实例?

Lógico

该代码给出了以下错误:

  

详细说明instance [TodosVerifiedSemigroup] VerifiedSemigroup Lógico where semigroupOpIsAssociative l c r = ?vsemigroupTodos 的类型时,方法Prelude.Algebra.Main.TodosVerifiedSemigroup:   无法解析类型类semigroupOpIsAssociative

2 个答案:

答案 0 :(得分:2)

idris-dev存储库中有一个open issue。埃德温布拉迪说:

  

目前(按设计)命名实例只能用于通过显式命名来解析类,即使没有正常实例。

所以在这里我们让Idris尝试解析未命名的Semigroup Lógico实例,这是为了定义VerifiedSemigroup Lógico实例所必需的。

我们需要一些方法在实例声明中指定应该使用命名实例来满足类约束。我不知道这是否可行。从相关问题引用Edwin:

  

此行为未记录在任何地方

答案 1 :(得分: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