У меня есть приложение React, и я использую компоненты c, в состоянии у меня есть запись под названием query, которая содержит лямбда-выражение в качестве значения. Это функция для ручного добавления новой функции в состояние для создания цепочки исполняемых функций.
Пример:
f: a -> b
g: b -> c
Then we can make a function
f_g: a -> c
Производство f_g
будет выполнено с событием onClick, изменяющим состояние на новую функцию.
Мой компонент выглядит следующим образом:
type Props = {}
type State<T> = { value: number, q: Func<number, T> }
class GenericComponent<T> extends React.Component<Props, State<T>> {
constructor(props: Props) {
super(props)
this.state = { q: Identity<number>(), value: 0 }
}
Incr = () => Func<number, number>(x => x + 1)
Shout = () => Func<number, string>(x => x + '!')
render() {
return <div>
<h1>Chaining a number function!</h1>
<h3>Initial value: {this.state.value}</h3>
<h3>Value: {this.state.q.f(this.state.value)}</h3>
<button onClick={event => {
this.setState({ ...this.state, q: this.state.q.then(this.Incr()) })
}} >Add value</button>
<button onClick={event => {
this.setState({ ...this.state, q: this.state.q.then(this.Shout()) })
}} >Shout</button>
<button onClick={event => {
this.setState({ ...this.state, q: Identity() })
}}>
Reset
</button>
</div>
}
}
This code doesn't compile unless I change the `T` to `any`, Iget the following type error:
Тип 'Fun c' нельзя назначить типу 'Fun c'.
Моя составная функция приведена ниже:
export interface Func<a, b> {
f: (_: a) => b
then: <c>(this: Func<a, b>, g: Func<b, c>) => Func<a, c>
repeat: (this: Func<a, a>) => Func<number, Func<a, a>>
repeatUntil: (this: Func<a, a>) => Func<Func<a, boolean>, Func<a, a>>
}
export let Func = <a, b>(f: (_: a) => b): Func<a, b> => {
return {
f: f,
then: function <c>(this: Func<a, b>, g: Func<b, c>): Func<a, c> {
return Func<a, c>(x => g.f(this.f(x)))
}
}
}
export let Identity = <a>(): Func<a, a> => Func(x => x)
Идентичность - это отправная точка функции, которая сразу же возвращает значение, но тип возвращаемого значения Func
может быть переменной. У кого-нибудь есть идея инициализировать параметр generi c на основе типа возвращаемого значения функции chain?