Что такое вложенные шаблоны? - PullRequest
0 голосов
/ 08 октября 2018

Что такое вложенные шаблоны?Я не могу понять, почему следующие шаблоны имеют вложенные шаблоны:

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

Кроме того, я не могу понять, чем отличаются вложенные шаблоны и вложенные выражения-выражения Могу ли я получить пример об этих вещах?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Может быть, это поможет, если мы раскладываем функцию в стиль карри, у которого нет вложенных шаблонов, в функции foo ниже есть только 3 (не вложенных) шаблона,

fun foo [] [] [] = []
  | foo (hd1::tl1) (hd2::tl2) (hd3::tl3) = (hd1, hd2, hd3)::zip3(tl1, tl2, tl3)
  | foo _ _ _ = raise BadTriple
and zip3 (l1, l2, l3) = foo l1 l2 l3

этоЛегко увидеть каждый отдельный шаблон, когда мы используем ключевое слово as, справа от каждого , поскольку является шаблоном.

fun zip3 (l1 as [], l2 as [], l3 as []) = []
  | zip3 (l1 as hd1::tl1, l2 as hd2::tl2, l3 as hd3::tl3) = (hd1, hd2, hd3)::zip3(tl1, tl2, tl3)
  | zip3 _ = raise BadTriple

Итак, почему мы рассматриваем это вложение?

мы можем добавить начальный аргумент as list_triple и увидеть, что на самом деле у нас есть шаблоны внутри шаблона.

fun zip3 (list_triple as (l1 as [], l2 as [], l3 as [])) = []
  | zip3 (list_triple as (l1 as hd1::tl1, l2 as hd2::tl2, l3 as hd3::tl3)) = (hd1, hd2, hd3)::zip3(tl1, tl2, tl3)

без as и неиспользуемые переменные будут выглядетьгораздо приятнее.

fun zip3 ([], [], []) = []
  | zip3 (hd1::tl1, hd2::tl2, hd3::tl3) = (hd1, hd2, hd3)::zip3(tl1, tl2, tl3)
  | zip3 _ = raise BadTriple
0 голосов
/ 09 октября 2018

что такое вложенные шаблоны?

шаблон в шаблоне - это вложенный шаблон.


Я не могу понять, почему это вложенные шаблоны

| (hd1::tl1,hd2::tl2,hd3::tl3) => ...
  • шаблон здесь: (list1, list2, list3)

  • вложенный шаблон здесь: list1 -> hd1::tl1, list2 -> hd2::tl2, list3 -> hd3::tl3


| (a,b,c)::tl =>
  • шаблон здесь: tuple::t1

  • вложенный шаблон здесь: tuple -> (a, b, c)

Также я не могу понять, чем отличается вложенный шаблони вложенный регистр выражений могу ли я получить некоторые примеры об этих вещах?


Это две разные вещи. Вложенный шаблон был объяснен выше.Что касается вложенных case-expression :

case something of              (*case here*)
| pattern =>
    case pattern of                (*nested case here*)
    | ...
0 голосов
/ 08 октября 2018

Вложенный шаблон - это шаблон, который содержит другие нетривиальные шаблоны (где под «нетривиальным» я подразумеваю «не переменный или шаблон с подстановочными знаками»).

([], [], []) - это вложенный шаблон, потому что(p1, p2, p3) - это шаблон (соответствующие кортежи), а [] - это также шаблон (соответствующие пустые списки), который здесь применяется к элементам тройки.Точно так же (hd1::tl1, hd2::tl2, hd3::tl3) является вложенным шаблоном, поскольку (p1, p2, p3) является шаблоном, а hd1::tl1, hd2::tl2 и hd3::tl3 также являются шаблонами (сопоставляя непустые списки).

Способ выразить то же самоебез вложенных шаблонов можно было бы переместить внутренние шаблоны в их собственные выражения падежа (хотя я бы не рекомендовал этого, потому что, как вы можете видеть, это немного усложняет код):

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)

Это вложенное выражение case, потому что у нас есть выражение case, которое содержит другие выражения case.Версия с вложенными шаблонами не была вложенным регистрным выражением, потому что было только одно регистрное выражение - не несколько внутри друг друга.

...