У меня есть структуры данных как таковой:данных Конструктор Ограничения
data IfTree = If Expr Statement IfTree | Else Statement | EndIf
data Statement = IfStatement IfTree
Что хотят, чтобы сделать это невозможно сделать какие-либо из этих комбинаций:
IfStatement $ Else ...
IfStatement $ EndIf
An IfStatement
должен принимать только If
.
Я знаю, что я могу скрыть конструкторы данных и только выставлять функции, которые составляют их за кулисами, но я хочу ограничить это по типу данных.
Update:
То, что я пытался сделать, было неуклюжим. Благодаря отличному ответы и комментарии, гораздо лучший способ обращения с этим было дано:
data Statement = If Expr Statement (Maybe Statement) | ...
или даже:
data Stat = IfStat Expr Stat | IfElseStat Expr Stat Stat | …
Это повторяет то, о чем прокомментировал @DanielWagner.Но сначала вы формализовали ответ, поэтому я буду отмечать ваш ответ как правильный. Спасибо за отличные предложения, ребята! – kurzweil4
Проведя некоторое время, глядя на это, я думаю, что я считаю, что IfStat/IfElseStat самый элегантный. – kurzweil4