Idris教程-以infix形式的命名实现的功能

时间:2018-07-18 23:38:10

标签: syntax idris

我正在阅读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 ZZ (<+> @{PlusNatSemi}) S Z都不起作用。

1 个答案:

答案 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