0

私は以下を持っています

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以下(上記)と呼んでv後でタイプを宣言するだけでいいのでしょうか?

data v = IntVat int

どんな助けでも大歓迎です:)

編集:投稿全体を変更して、もう少し情報と明確さを追加しました(演習の私の理解に基づいています)。

基本的に、参照として与えられたGADTのコンストラクターを理解するのに助けが必要data Expr = Condition v...etcです。

4

2 に答える 2

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

于 2012-04-26T17:27:03.540 に答える
0

それは私には実存的なタイプのように聞こえます。私は認めなければなりません、私はそれらを実際に使用したことはありません、私はそれらを理解しようとしただけです。とにかく、多分それはこのように意味されます:

data Expr = forall v. Condition v
          | And Expr Expr
          | Or Expr Expr

次に、次のようなGADTがあります(実存主義を一般化します。ここを参照してください)。

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)

これは、さまざまな種類の「条件」で機能します。

しかし、私はこのコードをテストしませんでした、そして私が言ったように、私は実存主義について実際には専門家ではありません。私のコードが正しいことを願っていますが、あなたがもっとよく知っているなら、誰か教えてください(または私は完全に間違っています...)

于 2012-04-26T09:33:12.957 に答える