Как вы читаете эту функцию curry’d из recompose .. у меня болит мозг

#reactjs #functional-programming #currying #recompose

#reactjs #функциональное программирование #каррирование #перекомпозируйте

Вопрос:

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

Кто-нибудь может объяснить на английском, как это работает?

Спасибо

   withStateHandlers(({ readAt, isSender }) => ({ trackVisibility: !isSender amp;amp; !readAt }), {
    updateTrackVisibility: () => () => ({
      trackVisibility: false,
    }),
  }),
  

Я знаю, что readAt и isSender исходят из фрагмента, объявленного выше.
Самая запутанная часть — это функция, которая возвращает другую функцию после updateTrackVisibility ???

Комментарии:

1. withStateHandlers вызывается с двумя параметрами. Первая — это функция, которая принимает два параметра и возвращает новый объект, вторая — это объект со свойством, которое содержит функцию, которая возвращает другую функцию, которая возвращает аналогичный объект. Ни одна из этих функций со стрелками не является необходимой, поэтому, если это поможет вам понять это, вы могли бы заменить их обычными функциями.

2. Шаблон () => указывает либо на отложенное вычисление (так сказать, явное отложенное вычисление), либо на функцию, которая игнорирует свой аргумент. updateTrackVisibility вероятно, выражает последнее. Однако результирующее значение жестко закодировано, что делает вложенную функцию arrow довольно бесполезной. Я бы предпочел что-то вроде этого: const comp = f => g => x => f(g(x)); const constant = x => _ => x; const constant2 = comp(constant) (constant) а затем constant2(false) (true) (true) выдает false .

3. Плохой код заставит болеть мозг любого. Double () => () => ... — это серьезный запах кода . @Kevin B, вы вызываете функцию не с параметрами, вы вызываете функцию с аргументами; аргументы привязаны к параметрам функции.

Ответ №1:

Из recompose API:

 withStateHandlers(
  initialState: Object | (props: Object) => any,
  stateUpdaters: {
    [key: string]: (state:Object, props:Object) => (...payload: any[]) => Object
  }
)
  

props передаются ли реквизиты от родителя (или HOC выше)

state передается из объекта, созданного в initialState

payload параметры передаются из того места, где мы запустили функцию (обработчик)

Что означает в вашем коде:

первый параметр ({ readAt, isSender }) => ({ trackVisibility: !isSender amp;amp; !readAt }) — создайте реквизит с именем trackVisibility (с закодированным значением)

второй параметр — добавьте функцию, которая при запуске делает trackVisibility значение false

Другой (надуманный) пример:

 const enhancer = withStateHandlers(({ title, text, maxChars }) => ({ isLongTitle: title.length > maxChars, text }), {
  addText: (state, props) => (text) => ({
    text: state.text   text,
    isLongTitle: state.text.length   text.length > props.maxChars
  }),
})

const MyComponent = enhancer(props => {
  return (
    <input onChange={event => props.addText(event.target.value)} />
  )
}