ここで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 を使用して文字列を解析し、構文ツリーを作成する方法はありますか?