Что такое ленивый стиль программирования - PullRequest
0 голосов
/ 30 мая 2019

Для проекта домашней работы я создаю инфраструктуру 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.

1 Ответ

1 голос
/ 30 мая 2019

Ленивый, в контексте портирования LINQ, означает возвращение объекта, который работает, когда повторяется, вместо того, чтобы выполнять некоторую работу, повторяющуюся над вашими входными данными, чтобы сгенерировать повторяемые выходные данные.

Как пример

Print(allNumbers.Where(isEven).Take(10))

Если Where равно Eager , это занимает бесконечное время, перечисляя каждое число.Если Where равно Ленивый , он перечисляет только числа до 20.

...