我想在我的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
必须是ty
和Decimal
之一的收入。第三次试用是使用一些不支持的假想语法..
答案 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)
@Twan van Laarhoven 's solution。
-1