是否可以在回调函数中使用 reduce ?

Is it possible to use reduce in a callback function?

我有这个简单的组件

let component = ReasonReact.statelessComponent("Input");

let make = (~name, ~onChange, ~value, _children) => {
    ...component,
    render: (_self) =>
        <input
            name=name
            onChange={(_) => {
              onChange(name, "change")
            }}
            value=value />
};

我正在尝试像这样使用它

<Input
    name="
    placeholder="Your email"
    onChange={self.reduce((name, value) => Change(name, value))}
    label=""
    value={self.state.email} />

但是我在 onChange 行收到这个错误

This is:
    ReasonReact.Callback.t(string) (defined as (string) => unit)
  But somewhere wanted:
    (string, string) => unit

  The incompatible parts:
    unit
    vs
    (string) => unit

我想我明白了这个错误,但我不知道如何修复它。我也这样定义onChange

onChange={(name, value) => self.reduce((_, _) => Change(name, value))}

但是这次我得到了

This is:
    ReasonReact.Callback.t('a) (defined as ('a) => unit)
  But somewhere wanted:
    unit

你知道如何解决吗?是否可以在另一个回调函数中调用 reduce

reduce 采用一元函数,returns 采用一元函数,但你的 onChange 应该是二元函数。因为你似乎控制了这两个方面,最简单的解决方法是只使用一个元组:

定义:

onChange={self.reduce(((name, value)) => Change(name, value))}

申请:

onChange={(_) => {
  onChange((name, "change"))
}}

或者,如果您不控制回调的使用方式,您可以像您尝试的那样将其包装在另一个函数中,但是由于 reduce returns 您必须显式调用一个函数它:

onChange={(name, value) => self.reduce(() => Change(name, value))()}

注意:您传递给 reduce 返回的回调的参数与将传递给 传递给[的回调的参数相同=33=] reduce,在本例中只是 ()。但是 value => self.reduce(val => Action(val))(value) 因此等同于只做 self.reduce(val => Action(val)).