language-agnostic - 究竟什么是懒惰式编程
问题描述
对于一个家庭作业项目,我正在 Typescript 中构建一个 Typesafe LINQ 框架,这里是项目描述:项目
描述说:“你的项目将以惰性风格生成一系列可执行函数。”
但我不知道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 风格编程方面使用一些帮助。
解决方案
懒惰,在移植 LINQ 的上下文中,意味着返回一个在迭代时可以工作的对象,而不是做一些工作来迭代输入数据以生成可迭代的输出数据。
举个例子
Print(allNumbers.Where(isEven).Take(10))
如果Where
是Eager,这需要无限时间,枚举每个数字。如果Where
是Lazy,它只枚举最多 20 的数字。
推荐阅读
- mysql - php版本从5.6升级到7.2后阿拉伯字符变成问号
- android - Android中的@字符-at字符的含义是什么?
- c - (*(QUEUE **) &((*(q))[0])) 在 libuv 中是什么意思,或者队列是如何工作的?
- c# - Webview 视频全屏
- angular - 在表格中显示来自 REST API 的嵌套 JSON
- php - mysql php ajax - 链式下拉列表显示具有两个匹配列的行的值
- matlab - 估计时间序列中的 Xn 值对 X 的预测程度
- python - 如何使用串行端口输入更改 micro:bit LED 矩阵上的图标
- python - 如何增加python中3d点的密度?
- firebase - 即使用户相同,也会创建新文档?