Вложенные операторы case в SML
Это скорее стилистический вопрос, чем что-либо еще. Учитывая следующий фрагмент кода:
case e1 of (* datatype type_of_e1 = p1 | p2 *)
p1 => case e11 of (* datatype type_of_e11 = NONE | SOME int *)
NONE => expr11
| SOME v => expr12 v
| p2 => case e21 of (* datatype type_of_e21 = NONE | SOME string *)
NONE => expr21
| SOME v => expr22 v
Есть ли способ разрешить ошибку types of rules don't agree
, вызванную попыткой сопоставить соответствие e11 с p2, кроме включения выражения p1 в скобки? У p2-шаблона есть другой аргумент case, чтобы избежать ответа "просто переключить шаблоны", -).
update: изменил код, чтобы отразить более конкретный случай
Ответы
Ответ 1
Нет. Синтаксические правила в определении стандартного ML утверждают, что совпадение слов выражения случая пытается максимально использовать потенциальные предложения. И поскольку в языке нет "конечного случая" или подобного маркера, парсер будет весело есть каждый из предложений "| pat = > exp", которые вы его кормите, пока не увидит что-то, что завершает список предложений соответствия.
Ответ 2
Ответ: "(" и ")". Мой пример:
case e1 of
p1 => ( case e11 of
NONE => expr11
| SOME v => expr12 v )
| p2 => ( case e21 of
NONE => expr21
| SOME v => expr22 v )
Это действительно работает! Cool:) Вы тоже можете попробовать.
Ответ 3
Обычный и короткий ответ: нет. Но что не так с круглыми скобками?
(Конечно, вы можете также скопировать другими способами, например, с помощью "let" или путем включения в вспомогательные функции, но круглые скобки являются каноническим решением.)