什么是嵌套模式?

KFC*_*KFC 0 sml smlnj

什么是嵌套模式?我无法理解为什么以下嵌套模式:

exception BadTriple

fun zip3 list_triple =
    case list_triple of
         ([],[],[]) => []
       | (hd1::tl1,hd2::tl2,hd3::tl3) => (hd1,hd2,hd3)::zip3(tl1,tl2,tl3)
       | _ => raise BadTriple

fun unzip3 lst =
    case lst of
         [] => ([],[],[])
       | (a,b,c)::tl => let val (l1,l2,l3) = unzip3 tl
                        in
                          (a::l1,b::l2,c::l3)
                        end
Run Code Online (Sandbox Code Playgroud)

另外,我无法理解嵌套模式嵌套case-expression之间有什么不同我可以得到一些关于这些事情的例子吗?

sep*_*p2k 5

嵌套模式是包含其他非平凡模式的模式(其中"非平凡"是指"不是变量或通配符模式").

([], [], [])是一个嵌套模式,因为它(p1, p2, p3)是一个模式(匹配元组),[]也是一个模式(匹配空列表),这里应用于三元组的元素.同样(hd1::tl1, hd2::tl2, hd3::tl3)是嵌套模式,因为它(p1, p2, p3)是一个模式hd1::tl1,hd2::tl2并且hd3::tl3也是模式(匹配非空列表).

在没有嵌套模式的情况下表达相同内容的方法是将内部模式移动到它们自己的case表达式中(虽然我不推荐它,因为正如你所看到的,它使代码变得更加复杂):

case list_triple of
(x, y, z) =>
  case x of
  [] =>
    case y of
    [] =>
      case z of
      [] => []
      | _ => raise BadTriple
    | _ => raise BadTriple
  | hd1 :: tl1 =>
    case y of
    [] => raise BadTriple
    | h2 :: tl2 =>
      case z of
      [] => raise BadTriple
      | h3 :: tl3 =>
        (hd1,hd2,hd3)::zip3(tl1,tl2,tl3)
Run Code Online (Sandbox Code Playgroud)

这是一个嵌套的case表达式,因为我们有一个包含其他case表达式的case表达式.具有嵌套模式的版本不是嵌套的case表达式,因为只有一个case表达式 - 彼此之间不是多个.