19

これは何よりも文体的な質問です。次のコードが与えられます:

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

p1の式を括弧で囲む以外に、e11p2types of rules don't agreeにパターンマッチしようとすることによって引き起こされるエラーを解決する方法はありますか?p2パターンには、 「パターンを切り替えるだけ」の答えを避けるために、別のcaseステートメントがあります;-)。

更新:より具体的なケースを反映するようにコードを変更しました

4

3 に答える 3

19

答えは「(」と「)」です。私の例:

case e1 of                   
   p1 => ( case e11 of         
              NONE => expr11
              | SOME v => expr12 v )
   | p2 => ( case e21 of         
                NONE => expr21
                | SOME v => expr22 v )

これは本当にうまくいきます!かっこいい:)あなたもそれを試すことができます。

于 2014-10-18T18:05:42.693 に答える
10

いいえ。StandardMLの定義の構文規則では、case式のマッチアームは潜在的な句を最大限に消費しようとしています。また、言語には「エンドケース」または同様のマーカーがないため、パーサーは、一致句のリストを終了するものが見つかるまで、フィードした各「| pat=>exp」句を楽しく食べます。

于 2013-02-05T20:44:22.350 に答える
4

わかりやすく短い答え:いいえ。しかし、括弧の何が問題になっていますか?

(もちろん、他の方法、たとえば「let」を使用したり、補助関数を考慮したりすることもできますが、括弧は標準的な解決策です。)

于 2013-02-05T15:28:47.627 に答える