私は現在、Haskellに埋め込まれた構文のような(一種の)typesafexmlを作成しようとしています。結局、私はこのようなことを達成したいと思っています:
tree = group [arg1 "str", arg2 42]
[item [foo, bar] []
,item [foo, bar] []
]
ここで、グループとアイテムは種類がありNode :: [Arg t] -> [Node c] -> Node t
ます。これが意味をなさない場合は、おそらく私が何をしているのかわからないためです:)
今の私の質問は、型システムがに「間違った」引数を与えるのを防ぐ方法ですNode
。たとえばNode
、型のsは型のGroup
引数のみを持つことができますが、sは型Arg1
との引数を持つことができます。Arg2
Item
Foo
Bar
肝心な質問は、異種リストのタイプをどのように制限するかということだと思います。
私が達成しようとしている(ユーザー)構文の例:
group .: arg1 "str" .: arg2 42
item .: foo .: bar
item .: foo .: bar
ここで、(。:)は、ノードにパラメーターを設定する関数です。これは、2つのアイテムを含むいくつかのパラメーターを持つグループを表します。
さらに、次のような(疑似)定義があります。
data Node = Node PossibleArguments PossibleChildNodes
type Group = Node [Arg1, Arg2] [Item]
type Item = Node [Foo, Bar] []
タイプチェッカーで使用エラーをキャッチする方法を探しています。