2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Typed/UntypedなASTの実装アイデアのメモ

Last updated at Posted at 2013-03-22

アカウントは作ったものの一回もQiitaに投稿したことないので、
お試しがてら今思いついたアイデアをひとつ投下。

例えば

x : 文字列
n : 整数
c ::= () | True | False | n
e ::= c | Let x e e | If e e e

のように定義される式eに対応するASTを実装するにあたり、
Untyped/Typedな型が両方必要だとする。
(例えばパースした直後はUntypedだろうし、型付けする関数typingの型はtyping :: TypeEnv -> UntypedExpr -> TypedExprのようになるはず)

このようなときは子の型をパラメタで置き、ASTの親子構造だけ定義した型を作り、
それに実際にパラメタを渡して作ると綺麗に書ける。
具体的にはこんなん。

ast_struct.hs
type VarName = String
data Type = UnitT | BoolT | IntT | FunT Type Type
data ExprStruct child = UnitE | BoolE Bool | IntE Int | Var VarName | Let VarName child child | If child child child
data UntypedExpr = UExp (ExprStruct UntypedExpr)
data TypedExpr = TExp {expr::ExprStruct TypedExpr, typ::Type}

Untyped ASTはIf (BoolE True) UnitE UnitEみたいに書けたらよかったけど、
type UntypedExpr = ExprStruct UntypedExprは流石に通らない。
(この辺うまくやる方法あったら教えてください……)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?