haskell GADTs构造函数

时间:2012-04-26 08:47:50

标签: haskell gadt

我有以下

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可以是任何类型,即intbool等,因此可以将其称为以下(上方)并声明{{1}的类型以后?

v

任何帮助将不胜感激:)

编辑:更改了整个帖子,添加了更多信息和清晰度(基于我对练习的理解)。

基本上我需要帮助找出GADT的构造函数,并给出data v = IntVat int 作为参考。

2 个答案:

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

适用于不同类型的“条件”。

我没有测试这段代码,而且,正如我所说,我对于存在感并不是一个专业人士。我希望我的代码是正确的,但请告诉我任何人,如果你知道的更好(或者我完全错了......)

相关问题