Написание функции калькулятора - наиболее функциональным способом программирования (javascript)

Я пытаюсь выполнить задачу из кодовых войн и хотел написать функциональный способ программирования в javascript. У меня есть несколько вопросов относительно моих функций и того, как лучше написать код.

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

'..... + ...'

Калькулятор должен разделить строку по среднему символу, обозначающему операцию, и тогда две оставшиеся строки будут двумя значениями. В приведенном выше примере первое значение будет равно 5, а второе — 3. Как только это будет сделано, в зависимости от оператора выполните действие — сложение, умножение и т. д.

Вот мой код:

function dotCalculator(equation) {

    function returnSymbol(input) {

        if (input.includes(' + ')) {
            return ' + ';
        } else if (input.includes(' - ')) {
            return ' - ';
        } else if (input.includes(' * ')) {
            return ' * ';
        } else if (input.includes(' / ')) {
            return ' / ';
        }

    }

    let symbolOf = returnSymbol;

    let result = equation.split(symbolOf(equation)).map(x => x.length);
    
    // Array.prototype.add = function(){
    //     return this[0] + this[1];
    // }
}

Я знаю, что мой код еще не готов. Я пытаюсь понять, как правильно закончить его, имея в виду образ мышления функционального программирования. Возможно, прототипное наследование было бы немного излишним. Я ищу некоторые идеи от любого, кто протянет руку. Я попытался написать более сложное сокращение после

let arrMine = equation.split(symbolOf(equation)).map((x) => x.length);

но это казалось слишком грязным. Любая помощь будет принята с благодарностью.

Может ли уравнение иметь более одной операции? например: ..... + ... - .. (это будет следовать стандартным операциям, сначала сложение, потом вычитание)?

Nick Parsons 22.03.2022 09:22

@NickParsons Здравствуйте, будет присутствовать только одна операция.

grizzled_carcass 22.03.2022 09:24

Я не совсем уверен, как работает stackoverflow, но поможет ли добавление тега functional-programming?

Ben Stephens 22.03.2022 15:45

@BenStephens Спасибо! Может я просто не увидел именно этот тег.

grizzled_carcass 22.03.2022 16:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
4
106
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В этом примере представлены функциональные программы, которые могут выполнять простые арифметические действия — сложение, вычитание, умножение или деление двух чисел.

Подробности прокомментированы в примере ниже
Note: prefix any negative number being passed into calc() with an underscore _ instead of a hyphen -

// Utility function
const log = data => console.info(JSON.stringify(data));

// Arithmetic functions
const sum = (a, b) => (+a) + (+b);
const dif = (a, b) => a - b;
const pro = (a, b) => a * b;
const quo = (a, b) => a / b;

/**
 * Calculate a simple formula a+b, a-b, a*b, or a/b.
 * @param {string} formula - Pattern:
 *  "numberOPERANDnumber" ex. "5+5"
 *  Use an underscore to prefix negative numbers.
 * @returns {number} Result of formula
 */
const calc = formula => {
  // Declare variables
  let result, f, a, b, op;

  /*
  Convert string into an array of strings.
  [number, operand, number]
  Replace any _ with - (see @param)
  */
  f = formula.split(/([+\-*/])/)
    .map(ab => ab.replace('_', '-'));

  /*
  Convert string of numbers into real numbers.
  */
  a = parseFloat(f[0]);
  b = parseFloat(f[2]);
  op = f[1];

  /*
  Check if >a< and >b< are real numbers and if the input string was split 
  into 3 strings.
  */
  if (Number.isNaN(a) || Number.isNaN(b) || f.length != 3) {
    return;
  }

  // >op< determines the method of resolving the formula
  switch (op) {
    case '+':
      result = sum(a, b);
      break;
    case '-':
      result = dif (a, b);
      break;
    case '*':
      result = pro(a, b);
      break;
    case '/':
      result = quo(a, b);
      break;
    default:
      return;
  }
  return result;
};

log(calc('5+5'));
log(calc('_10-7')); // That's a -10 (see @param)
log(calc('5*9'));
log(calc('51/3'));
Ответ принят как подходящий

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

const arith = {
  '+': (a, b) => a + b,
  '-': (a, b) => a - b,
  '*': (a, b) => a * b,
  '/': (a, b) => a / b,
};

const pipe = (...fns) => (arg) => fns.reduce((res, fn) => fn(res), arg);

const get_input_elements = (input) => input.split(' ');

const get_number = (dots) => dots.length;

const get_numbers = ([str_a, op, str_b]) =>
  [get_number(str_a), op, get_number(str_b)];

const apply_arith = ([a, op, b]) => arith[op](a, b);

const calc = pipe(
  get_input_elements,
  get_numbers,
  apply_arith
);

console.info(calc('..... + ...'));
console.info(calc('..... - ...'));
console.info(calc('...... / ..'));

На самом деле, я думаю, что моего описания ввода может не хватать. Ввод действительно будет похож на ввод, который вы использовали при вызове calc. Так что я думаю, что это именно то, что я искал. Я буду отлаживать код, который вы предоставили, и попытаюсь извлечь из него уроки - большое спасибо! У меня иногда возникают затруднения с более лаконичными названиями - а, б, оп, но я понимаю, что вы подразумеваете под ними. Для меня важно научиться также ЧИТАТЬ чужой код.

grizzled_carcass 22.03.2022 16:47

Другие вопросы по теме