Для проекта домашней работы я создаю инфраструктуру Typesafe LINQ в Typescript, вот описание проекта: Проект
В описании сказано: «Ваш проект сгенерирует цепочку исполняемых функций в стиле lazy».
Но я не знаю точно, что Ленивый означает здесь?
Я создал таблицу, содержащую все операторы, но проблема в том, что все функции немедленно возвращают результат.
interface Table<T, U> {
readonly data: Pair<List<T>, List<U>>
Select: <K extends keyof T>(this: Table<T, U>, properties: K[]) => Table<Omit<T, K>, Pick<T, K> & U>
}
const Table = <T, U>(data: Pair<List<T>, List<U>>): Table<T, U> => ({
data: data,
Select: function <K extends keyof T>(this: Table<T, U>, properties: K[]): Table<Omit<T, K>, Pick<T, K> & U> {
let selection = this.data.First.map(entry => pickMany(entry, properties))
let result = this.data.map(
first => first.map(entry => omitMany(entry, properties))
,
second => merge_list_types(second.zip(selection))
)
return Table(result)
},
})
Итак, мое основное понимание Lazy заключается в том, что операторы должны возвращать исполняемую функцию, которая будет вызываться позже в программе. Но я не знаю, как это сделать.
Также учителя предоставили мне упаковку для функции:
export interface Func<a, b> {
f: (_: a) => b
then: <c>(this: Func<a, b>, g: Func<b, c>) => Func<a, c>
}
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)))
},
}
Должен ли я просто вернуть Func<Table<Something, Something>, Table<AnotherThing, AnotherThing>>
, чтобы каждый оператор делал его ленивым? Я не уверен, похоже, достойное решение. Но я могу использовать некоторую помощь в понимании программирования в стиле Lazy.