私は、動的言語用の型付けされたASTを作成したいと思います。現在、私はコレクションの取り扱いについていません。ここでは代表的なコードサンプルです:GADT公式ASTの異種コレクションのタイプを指定するにはどうすればよいですか?
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE ExistentialQuantification #-}
data Box = forall s. B s
data BinOp = Add | Sub | Mul | Div
deriving (Eq, Show)
data Flag = Empty | NonEmpty
data List :: Flag -> * -> * where
Nil :: List Empty a
Cons :: a -> List f a -> List NonEmpty a
data Expr ty where
EInt :: Integer -> Expr Integer
EDouble :: Double -> Expr Double
-- EList :: List -> Expr List
私は十分List
のインスタンスを構築することができますが:
*Main> :t (Cons (B (EInt 1)) (Cons (B (EDouble 2.0)) Nil))
(Cons (B (EInt 1)) (Cons (B (EDouble 2.0)) Nil))
:: List Box 'NonEmpty
私は全然EList
ためExpr
でこのタイプをエンコードするかどうかはわかりません。私はここでも正しい道を歩いていますか?
異種コレクションはありません。タイプ「ボックス」は役に立たないです。 'seq'を呼び出す以外には、値は何もできません。この問題は、Haskell自体の異種コレクションではなく、異種コレクションをサポートするHaskellの型システムのモデリングです。しかし、 "動的に型指定された"のように "動的"を意味するならば、動的に型付けされた言語の表現が静的にメタ言語(Haskell)に型付けされることは意味を成さない。 – user2407038
[GADTの[DataKind]のリスト](http://stackoverflow.com/questions/28388715/list-of-any-datakind-in-gadt/)の可能な複製。 – user3237465