Функциональное программирование соответствия шаблонов в JavaScript - PullRequest
0 голосов
/ 21 мая 2018

Я пишу компилятор с функционального языка для JS.Компилятор будет работать в браузере.Мне нужно реализовать механику сопоставления с образцом в JS, потому что оригинал есть.Я нашел Спарклер и Z .Насколько я знаю, Sparkler не может быть выполнен в браузере, и Z не имеет всех необходимых мне возможностей.

Так что мой язык имеет такую ​​семантику:

count x []         <- 0
count x [ x : xs ] <- 1 + count x xs
count x [ y : xs ] <- count x xs

Вот чтопроисходит в следующем фрагменте:

Первая строка - это определение функции, которая принимает два параметра: некоторую переменную x и пустой список и возвращает ноль.

Вторая строка - это определение функции, котораятакже принимает два параметра: некоторую переменную x и список, который начинается с x и возвращает 1 + count(x, xs)

В этом примере я хочу создать код, подобный следующему:

const count = (x, list) => {
    match(x, list) => (
        (x, []) => {...}
        (x, [ x : xs ]) => {...}
        (x, [ y : xs ]) => {...}
    )
} 

Как правильно развернутьэтот тип сопоставления с ifs и ors?

1 Ответ

0 голосов
/ 23 мая 2018

Общий случай

В ECMAScript есть предложение для сопоставления с образцом, но по состоянию на 2018 г. оно находится на очень ранней стадии.

В настоящее время только в разделе Реализациисписки:

Регистр

Использование деструктурирующее присвоение , например:

const count = list => {
  const [x, ...xs] = list;
  if (x === undefined) {
    return 0;
  } else if (xs === undefined) {
    return 1;
  } else {
    return 1 + count(xs);
  }
}
...