2016-11-02 4 views

ответ

6

Это pattern matching. От ссылки:

Функции могут состоять из одного или нескольких правил. Правило состоит из его имени функции, шаблона аргумента и его выражения. Когда функция вызывается, значения аргументов будут сопоставляться с шаблонами в порядке сверху вниз. Функции, использующие сопоставление с образцами, очень похожи на выражения case

Это означает, что труба отделяет случаи для сопоставления рисунка. Соответствие шаблону соответствует специальным шаблонам и выполняет конкретные выражения на основе этого шаблона. Они следуют синтаксису:

fun <fun-name> <pattern> 
    | <fun-name> <pattern> 
    | <fun-name> <pattern>; 

Где <pattern> является:

<args> = <expressions> 

В первом примере, это объявляющий функция fac для факторного расчета. Первый шаблон - это когда аргумент int равен 0. Если int равно 0, выражение этого случая будет выполнено, и в этом случае, если переданный аргумент равен 0, результат будет равен 1 (поскольку 0 факториал равен 1). Если переданный аргумент не равен 0, тогда он следует следующему шаблону (так как он не соответствует первому шаблону). Если переданный аргумент равен, скажем, 2, он выполнит рекурсию и соответствующим образом найдет факториал.


Рассмотрим фрагмент ниже:

fun past "run" = "ran" 
    | past "swim" = "swam" 
    | past x  = x^"ed"; 

Определим функцию с именем past, которая принимает аргумент и находит пропущенный напряженными аргумента. Первый шаблон эквивалентен - на простом английском языке:

Если слово (или переданный аргумент) «запущено», пройденное время «запущено».

Второй паттерн эквивалентен:

если слово (или передается аргумент) является «плавать», переданный напряженным является «плавали».

Если слово не является ни «плаванием», ни «бегом» (и, следовательно, два шаблона не совпадают), продолжайте с последним шаблоном, который просто добавляет «ed» в конец слова.

На этом примере вы можете увидеть, что | (труба) обозначают отдельные узоры. Вы можете думать о таких моделях, как этот псевдокод:

if argument is "run", then passed tense is "ran" 
else if argument is "swim", then passed tense is "swam" 
else add "ed" to end of word 

Соответствие шаблону используется для покрытия нерегулярных случаев.Поскольку «бег» и «плавание» имеют нерегулярные пройденные времена, мы покрываем эти случаи шаблонами. Тот же принцип применяется к первому примеру - 0! это особый случай: 1. Из-за этого мы можем использовать сопоставление шаблонов в соответствии с конкретным случаем, когда аргумент равен 0 и выполняется в соответствии с этим конкретным случаем.

+0

Не могли бы вы объяснить, как этот пост не нарушает https://meta.stackoverflow.com/questions/351354/ должен-я-быть-ответив-код-запросы? Я законно не понимаю. – gregblass

+0

@gregblass Этот вопрос не требует, чтобы для них был написан какой-то код, он просит объяснения концепции. – Li357

0

Что вы видите, это синтаксис ярлыка для определения функции и сопоставления шаблонов в аргументе одновременно. Если вы разделяете вне шаблону из определения функции, это будет выглядеть примерно так:

fun fac (x : int) : int = 
    case x of 
    0 => 1 
    | n => n * fac (n - 1) 

 Смежные вопросы

  • Нет связанных вопросов^_^