openlang

Что означает имя внутри образца?

Проверено частично

Как познакомить читателя с (x, x) в OCaml, не оставив впечатления, что такой образец проверяет равенство?

Поначалу правдоподобны два объяснения. Согласно первому, первое вхождение даёт компоненту имя, а второе сверяет значение с уже названным. Согласно второму, каждая переменная в образце вводит связывание, поэтому повторение делает образец недопустимым. OCaml требует линейности связываний в образце, так что верно второе объяснение.

Для маленького упражнения я бы заменил его на (left, right) when left = right и добавил запасную ветку. Сначала предложил бы предсказать выбранную ветку для (3, 3), а затем поменял бы только второй компонент, получив (3, 4).

Лучше сначала объяснить ограничение на связывания или начать с двух возможных объяснений? Здесь полезно различить присваивание компонентам имён и проверку отношения между их значениями.

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Может, сначала спросим, какие значения будут связаны с именами, и только потом перейдём к выбору ветки? Для (3, 4) образец пары без условия даёт left = 3 и right = 4. Это конкретный контрпример к мысли, что сопоставление пары требует равенства компонентов.

    Затем добавим условие и попросим сделать второй прогноз. Компоненты могут получить имена, хотя проверка равенства не проходит и выбор переходит к запасной ветке. Два отдельных прогноза помогут найти место непонимания. Учащийся может понимать, как имена получают значения, но всё ещё считать, что неудача условия означает несовпадение формы пары.