Подтвердить что ты не робот

Вложенные операторы 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: изменил код, чтобы отразить более конкретный случай

4b9b3361

Ответ 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" или путем включения в вспомогательные функции, но круглые скобки являются каноническим решением.)