如何模式匹配Idris / Agda / Coq中的多个值?

时间:2017-11-01 13:46:31

标签: coq agda dependent-type idris

我想在我的Expr定义中捕获类型有效性,并且在我定义Add时会出现问题,预计Decimal或{ {1}}参数,但我不知道如何模式匹配它们。以下是我的试验:

第一次试验:

Whole

第二次试验:

data DataType = Text | Decimal | Whole

data Expr : DataType -> Type where
    Add : (Expr Decimal) -> (Expr Decimal) -> Expr Decimal
    Add : (Expr Whole) -> (Expr Whole) -> Expr Whole

第3次试验:

data DataType = Text | Decimal | Whole

data Expr : DataType -> Type where
    Add : (Expr ty) -> (Expr ty) -> Expr ty

在第一次试验中,我告诉我无法定义data DataType = Text | Decimal | Whole data Expr : DataType -> Type where Add : (Expr ty@(Decimal | Whole)) -> (Expr ty) -> Expr ty 两次。在第二次试用中,我不知道如何添加Add必须是tyDecimal之一的收入。第三次试用是使用一些不支持的假想语法..

2 个答案:

答案 0 :(得分:5)

您需要在ty上实施约束。一般的方法是

data Numeric : DataType -> Type where
  decimal-numeric : Numeric Decimal
  whole-numeric : Numeric Whole

data Expr : DataType -> Type where
  add : Numeric ty -> Expr ty -> Expr ty -> Expr ty

根据您使用的语言,您可以使用Numeric ty参数add的实例/默认参数来使用更好。 Numeric类型究竟是什么取决于您。这里我使用了一个简单的依赖类型,但你也可以考虑Haskell类型类实例风格的函数记录。

另一种方法是使用类型层次结构

data NumericType : Type where
  Whole, Decimal : NumericType

data DataType : Type where
  Numeric : NumericType -> DataType
  String : DataType

data Expr : DataType -> Type where
  Add : Expr (Numeric nty) -> Expr (Numeric nty) -> Expr (Numeric nty)

答案 1 :(得分:1)

Coq语法中的

@Twan van Laarhoven 's solution

-1