Я пытаюсь выполнить задачу из кодовых войн и хотел написать функциональный способ программирования в 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);
но это казалось слишком грязным. Любая помощь будет принята с благодарностью.
@NickParsons Здравствуйте, будет присутствовать только одна операция.
Я не совсем уверен, как работает stackoverflow, но поможет ли добавление тега functional-programming
?
@BenStephens Спасибо! Может я просто не увидел именно этот тег.
В этом примере представлены функциональные программы, которые могут выполнять простые арифметические действия — сложение, вычитание, умножение или деление двух чисел.
Подробности прокомментированы в примере ниже
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. Так что я думаю, что это именно то, что я искал. Я буду отлаживать код, который вы предоставили, и попытаюсь извлечь из него уроки - большое спасибо! У меня иногда возникают затруднения с более лаконичными названиями - а, б, оп, но я понимаю, что вы подразумеваете под ними. Для меня важно научиться также ЧИТАТЬ чужой код.
Может ли уравнение иметь более одной операции? например:
..... + ... - ..
(это будет следовать стандартным операциям, сначала сложение, потом вычитание)?