我有以下
data Expr = Condition v
| And Expr Expr
| Or Expr Expr
我被要求考虑以下无类型版本才能完成:
data Expr e where
我不确定我想为构造函数编写什么。我尝试了以下方法:
data Expr e where
Condition :: v -> Expr v
And :: -- really not sure what to do with this one
OR :: Expr b -> (Expr b -> Expr a) -> Maybe Expr a -> Expr b
此外,由于v
可以是任何类型,即int
,bool
等,因此可以将其称为以下(上方)并声明{{1}的类型以后?
v
任何帮助将不胜感激:)
编辑:更改了整个帖子,添加了更多信息和清晰度(基于我对练习的理解)。
基本上我需要帮助找出GADT的构造函数,并给出data v = IntVat int
作为参考。
答案 0 :(得分:3)
如果我使用基本表达语言作为激励示例在GADT上设置作业,那么这就是我想到的答案:
data Expr v where
Literal :: v -> Expr v
And :: Expr Bool -> Expr Bool -> Expr Bool
Or :: Expr Bool -> Expr Bool -> Expr Bool
-- and I'd probably add some things like this to
-- show why the type variable is useful
Equal :: Expr Int -> Expr Int -> Expr Bool
If :: Expr Bool -> Expr v -> Expr v -> Expr v
您可以看到为什么可以将其称为“类型化”表达式:类型变量的实例化看起来像是为小语言键入规则:
a : Bool b : Bool
-------------------------
And a b : Bool
a : Int b : Int
------------------------
Equal a b : Bool
等
答案 1 :(得分:0)
这对我来说听起来像是一种存在主义类型。我必须承认,我从来没有真正使用它们,我只是试图理解它们;无论如何,也许这意味着:
data Expr = forall v. Condition v
| And Expr Expr
| Or Expr Expr
然后你有一个像这样的GADT(他们概括了存在感,见here):
data Expr where
Condition :: v -> Expr
And :: Expr -> Expr -> Expr
Or :: Expr -> Expr -> Expr
虽然这不是(据我理解的概念)很有意义,因为你不能使用v
来做任何事情。
另一方面,这个会(我希望)更有意义(因为有一个“条件”):
class Testable v where
test :: v -> Bool
data Expr where
Condition :: Testable v => v -> Expr
And :: Expr -> Expr -> Expr
Or :: Expr -> Expr -> Expr
然后你可以做,例如
eval :: Expr -> Bool
eval (Condition v) = test v
eval (And e1 e2) = (eval e1) && (eval e2)
eval (Or e1 e2) = (eval e1) || (eval e2)
适用于不同类型的“条件”。
我没有测试这段代码,而且,正如我所说,我对于存在感并不是一个专业人士。我希望我的代码是正确的,但请告诉我任何人,如果你知道的更好(或者我完全错了......)