Pull to refresh

Comments 34

Помню в прошлом году, когда я только знакомился с Ramda, вот эта статья очень сильно вдохновила (сорри, на англ.языке).
Функции R.compose и R.pipe могут принимать до 10 аргументов.
Непонятны ни причина ограничения, ни истина этого высказывания. В коде ограничения нету.
Подтверждаю. Интересно, откуда у автора возникла такая строка? А переводчик не проверил.

Возможно, в старых версиях было такое ограничение.

Я сразу полез проверить, может там применена страшная оптимизация, с развёрткой кода в «китайский стиль», но нет, всё чисто.
Могу только предположить, что подобное ограничение могло бы быть связано с классами, где применить Function::apply не получится.
Например:
function fn(){}
function call(){
 return fn.apply(null, arguments);
}

function class(){}
function make(a,b,c,d,e,f,g,h,i,j,k,l){
 // apply вместе с new не применишь, только так
 return new class(a,b,c,d,e,f,g,h,i,j,k,l);
}
Вполне возможно. Такое неприятное ограничение на конструктор имеет место быть.

Правда, существует и для этой неприятности обходной манёвр:

function make () {
  var instance = Object.create(class.prototype);
  class.apply(instance, arguments);
  return instance;
}
Композиция, рассчитанная на обещание
А почему бы не использовать композицию с помощью .then? Может, я не вижу ошибки, но разве следуюший код не выглядит ещё лучше и более знакомым программистам, нежели pPipe?
var getCostWithTaxAsync = getItem()
  .then(R.prop('cost'))
  .then(R.multiply(1 + TAX_RATE);

При этом они сами приводят пример такой композиции выше:

return getItems()
    .then(R.pluck('cost'));
После Ruby меня в JS убивает один нюанс: нет выбора между функциями, которые модифицируют объект (массив, строку...), и теми, которые возвращают новый экземпляр.

Большинство востребованных мной функций — возвращают новый экземпляр. Например, .map(), .reverse(), .filter(), .toLowerCase(). А иногда очень нужно изменить сам объект, потому что им пользуются другие части приложения.

С обратным направлением проще, так как всегда можно деструктивную функцию предварить .slice(), что возвращает новый экземпляр. Но писать .slice().sort(...), .slice().splice(...) тоже напрягает.

Почему ни одна библиотека вроде LoDash и Ramda не предлагает функции парами, типа .map() и .mapForce()?

PS Ramda понравилась наличием .mapObj(). Во всех остальных библиотеках приходилось вместо этого изгаляться с .reduce().
Думаю лучше так:

list.filter( odd ) // мутируем существующий объект

var list2 = list.filter( odd , [ 1 , 2 ] ) // мутируем переданный вторым аргументом
Я имею в виду, что переопределив `Array.prototype.filter` вы потеряете возможность запускать любой JS-код, кроме вашего собственного, рассчитанного на иное поведение `filter`.
Ок, так лучше, но тогда будет путаница между API JS и API Ramda.
Он же обратно совместим с js-апи (если не использовать в нём бесполезный второй параметр).
UFO just landed and posted this here
Функциональное программирование малость оторвано от жизни.
Равно как и любое другое.
Не равно. Компьютер оперирует битами и их состояниями. Человек мыслит объектами и их состояниями. ФП — это как эсперанто для общения между русским и украинцем.
Вот именно. Компьютер оперирует битами, поэтому все эти строки, классы, шаблоны малость оторваны от жизни. Только машкоды, только хардкор!
Очень смешно, но вы всё же подумайте над моим высказыванием. Там немного больше смысла, чем вы заметили при беглом прочтении.
Вы знаете, я за свою жизнь столько наслушался тезисов от противников (или даже несторонников) ФП, что оно нинужно — т. к. компьютер императивен/мышление императивно/вселенная императивна (нужное подчеркнуть), — что вряд ли найду в вашем высказывании что-то, на что пришлось бы придумывать новый контраргумент, или, тем паче, поставило бы в тупик.
Я как раз сторонник ФП, но без фанатизма. Язык программирования служит для объяснения машине что от неё хочет человек. Языки программирования развивались от понятных машине, но не понятных человеку, до понятных человеку и зубодробительных для машины. Какой смысл использовать идиомы чуждые как человеку так и машине в равной степени?
А вы уверены, что прям-таки совсем чуждо? И что, допустим, чуждость мышлению — имманентная, принципиальная, а не приобретённая из-за того, что 99% начинуют учиться программированию с императивных языков?
Мы мыслим так, как взаимодействуем с миром. А взаимодействуем мы с ним объектно ориентированно.
Очень интересно. Когда я пишу ручкой на бумаге, кто есть объект, и как мы взаимодействуем? «я.взять(ручка).написать(текст, бумага)»? Или всё-таки «бумага.написать(текст, ручка, я)»? Или даже «текст.появиться(бумага, я.взять(ручка))»? А в ситуациях, когда нет явно выраженного агенса и пациенса, то есть предполагаемые объекты равноправны?
Думаю, вы и без меня знаете, сколько копий сломано на тему того, что считать объектом, насколько на самом деле адекватно ООП отражает т. н. реальный мир, и как со всем этим жить.
UFO just landed and posted this here
Важно то, что свойства этих объектов могут меняться.
UFO just landed and posted this here
После выхода lodash-fp теперь даже не очень понятна судьба Рамды. И неясно будет ли доводить Далтон lodash-fp до ума. Пока что к сожалению приходится использовать все три вместе: lodash, lodash-fp и ramdajs, каждая из этих библиотек имеет свои особенности и к сожалению пока ни одна их них не способна полностью заменить другую.
Я не нашел в документации R.pPipe и R.pCompose. На данный момент есть R.pipeP и R.composeP.
Sign up to leave a comment.

Articles

Change theme settings