我尝试在运营商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
答案 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