我正在阅读named implementations的教程,其中以Semigroup Nat
为例:
[PlusNatSemi] Semigroup Nat where
(<+>) x y = x + y
[MultNatSemi] Semigroup Nat where
(<+>) x y = x * y
如果我想使用Plus定义,则(<+>) @{PlusNatSemi} Z (S Z)
可以使用。但是有没有办法更固定地写这个呢? Z <+> S Z
抱怨缺乏实现,Z <+> @{PlusNatSemi} S Z
和Z (<+> @{PlusNatSemi}) S Z
都不起作用。
答案 0 :(得分:3)
在这种情况下,您需要明确定义要使用的命名实现。
但是Idris
允许默认情况下在带有using
表示法的声明块中使用命名的实现。因此,在您的示例中,它将是:
[PlusNatSemi] Semigroup Nat where
(<+>) x y = x + y
[MultNatSemi] Semigroup Nat where
(<+>) x y = x * y
using implementation PlusNatSemi
semiPlus : Nat -> Nat -> Nat
semiPlus x y = x <+> y
using implementation MultNatSemi
semiMul : Nat -> Nat -> Nat
semiMul x y = x <+> y