我目前正在尝试创建一个(某种)类型安全的 xml,例如嵌入到 Haskell 中的语法。最后,我希望实现这样的目标:
tree = group [arg1 "str", arg2 42]
[item [foo, bar] []
,item [foo, bar] []
]
其中 group 和 item 是 kind Node :: [Arg t] -> [Node c] -> Node t
。如果这没有任何意义,那很可能是因为我不知道自己在做什么:)
我现在的问题是如何使类型系统阻止我向Node
. 例如Node
s 类型Group
only 可能有类型参数,Arg1
但Arg2
sItem
可能有类型参数Foo
和Bar
。
我想底线问题是:我如何限制异构列表中的类型?
我试图实现的(用户)语法示例:
group .: arg1 "str" .: arg2 42
item .: foo .: bar
item .: foo .: bar
其中 (.:) 是在节点中设置参数的函数。这将表示具有一些包含两个项目的参数的组。
此外,还会有一些(伪)定义,例如:
data Node = Node PossibleArguments PossibleChildNodes
type Group = Node [Arg1, Arg2] [Item]
type Item = Node [Foo, Bar] []
我正在寻找一种通过类型检查器捕获使用错误的方法。