2016-09-16 4 views
0

Я создаю простое приложение, используя Ramda.Звонок Arg в Рамде

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

Сценарий:

У меня есть объект передается в качестве параметра. Есть два атрибута на этом объекте, а также некоторые другие вещи, которые не относятся к проблеме, за исключением, что я хотел бы, чтобы не изменить его состояние:

{locCode :<string>, LocationList : [<Location>], someOtherParams : ... } 

У меня есть одна функция ARG, которая может преобразовать locCode к месту: fetchLocByCode

Мой желаемый результат здесь будет принимать значение locCode, передать его fetchLocByCode, добавьте LocationList с результатом, и возвращает новый объект с новым LocationList, не касаясь ничего другого на объекте ,

Что-то, аналогичными:

(Param)=>{ 
Param.LocationList.push(fetchLocByCode(Param.locCode)); 
return Param; 
} 

То, что я в конечном итоге написание, чтобы сделать это, кажется, очень смешно и заставляет меня поверить, что я сделал что-то ужасно неправильно:

const locListLens = R.lens(R.prop('LocationList'),R.assoc('LocationList')) 
const appendLocList = (i)=>R.compose(R.over(locListLens),R.append,fetchLocByCode,R.prop('locCode'))(i)(i) 

Это решение " работает ", но кажется, что я пропустил какую-то фундаментальную идею.

Может ли кто-нибудь пожелать представить более «канонический» способ решения этого сценария?

ответ

3

Начнем с первоначальной версии:

Param => { 
    Param.LocationList.push(fetchLocByCode(Param.locCode)); 
    return Param; 
} 

Я очень надеюсь, что мутация не требуется. Давайте удалим его:

Param => 
    R.assoc('LocationList', 
      R.append(fetchLocByCode(Param.locCode), Param.LocationList), 
      Param) 

Мы могли бы использовать объектив, чтобы избежать доступа к LocationList собственности дважды:

Param => 
    R.over(R.lensProp('LocationList'), 
     R.append(fetchLocByCode(Param.locCode)), 
     Param) 

Можно ли избавиться от Param целиком? Давайте начнем с использованием R.converge:

R.converge(R.over(R.lensProp('LocationList')), 
      [Param => R.append(fetchLocByCode(Param.locCode)), 
      R.identity]) 

Давайте использовать R.compose для удаления Param из первой функции ветвления:

R.converge(R.over(R.lensProp('LocationList')), 
      [R.compose(R.append, fetchLocByCode, R.prop('locCode')), 
      R.identity]) 

В любое время вы оказываетесь писать R.converge(f, [g, R.identity]) вы обнаружили использование для S комбинатора!

S.S(R.flip(R.over(R.lensProp('LocationList'))), 
    R.compose(R.append, fetchLocByCode, R.prop('locCode'))) 

Хотя это опрятно, я думаю, что версия R.assoc в порядке. Будущим читателям не понравилось бы иметь смысл S.S(R.flip(R.over(R.lensProp. ;)

+0

Спасибо! Ваши примеры помогут сделать это более разумным - Я действительно терялся, пытаясь остаться «свободным» и забыв, что по-прежнему можно просто напрямую получить доступ к собственности. –

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