8

ここでGADT の紹介を読んでいて、プログラマーが正しいタイプの構文ツリーのみを作成するように制限するというアイデアが素晴らしいことに気づき、このアイデアを単純なラムダ計算インタープリターに組み込みましたが、後で文字列を解析してこれは、入力に応じて、1 つの解析関数がさまざまなタイプの構文ツリーを返す必要があるためです。次に例を示します。

{-# LANGUAGE GADTs #-}
data Ident
data Lambda
data Application

data Expr a where
    Ident :: String -> Expr Ident
    Lambda :: Expr Ident -> Expr a -> Expr Lambda
    Application :: Expr a -> Expr a -> Expr Application

GADT を使用する前は、これを使用していました。

data Expr = Lambda Expr Expr
          | Ident String
          | Application Expr Expr

ここでは GADT が大きな利点ですLambda (Application ..) ..

しかし、GADT では、文字列を解析して解析ツリーを作成することができませんでした。以下は、Lambda、Ident、および Application 式のパーサーです。

ident :: Parser (Expr Ident)
ident = ...

lambda :: Parser (Expr Lambda)
lambda = ...

application :: Parser (Expr Application)
application = ...

問題は次のとおりです。

expr = choice [ident, application, lambda]

各パーサーが異なる型を返すため、これは明らかに機能しません。

では、GADT を使用して文字列を解析し、構文ツリーを作成する方法はありますか?

4

1 に答える 1

8

Expr aGADT を使用して、不明なを含む型を作成できますa

data AnyExpr where AnyExpr :: Expr a -> AnyExpr

特定のタイプに制限したくない状況では、 を使用します。ExprAnyExpr

anyExpr :: Parser (Expr a) -> Parser AnyExpr
anyExpr p = fmap AnyExpr p

expr :: Parser AnyExpr
expr = choice [anyExpr ident, anyExpr application, anyExpr lambda]
于 2012-06-19T15:45:35.760 に答える