- Hands-On Functional Programming with TypeScript
- Remo H. Jansen
- 269字
- 2021-07-02 14:03:12
Laziness
Many functional programming languages feature lazy-evaluated APIs. The idea behind lazy evaluation is that operations are not computed until doing so can no longer be postponed. The following example declares a function that allows us to find an element in an array. When the function is invoked, we don't filter the array. Instead, we declare a proxy and a handler:
function lazyFind<T>(arr: T[], filter: (i: T) => boolean): T {
let hero: T | null = null;
const proxy = new Proxy(
{},
{
get: (obj, prop) => {
console.log("Filtering...");
if (!hero) {
hero = arr.find(filter) || null;
}
return hero ? (hero as any)[prop] : null;
}
}
);
return proxy as any;
}
It is only later, when one of the properties in the result is accessed, that the proxy handler is invoked and filtering takes place:
const heroes = [
{
name: "Spiderman",
powers: [
"wall-crawling",
"enhanced strength",
"enhanced speed",
"spider-Sense"
]
},
{
name: "Superman",
powers: [
"flight",
"superhuman strength",
"x-ray vision",
"super-speed"
]
}
];
console.log("A");
const spiderman = lazyFind(heroes, (h) => h.name === "Spiderman");
console.log("B");
console.log(spiderman.name);
console.log("C");
/*
A
B
Filtering...
Spiderman
C
*/
If we examine the console output, we will be able to see that the Filtering... message is not logged into the console until we access the property name of the result object. The preceding implementation is a very rudimentary implementation, but it can help us to understand how lazy evaluation works. Laziness can sometimes improve the overall performance of our applications.
We will learn more about function composition patterns later in Chapter 9, Functional-Reactive Programming.
- 高手是如何做產品設計的(全2冊)
- Getting started with Google Guava
- 架構不再難(全5冊)
- 程序員面試筆試寶典
- AngularJS Web Application Development Blueprints
- Network Automation Cookbook
- Rust Essentials(Second Edition)
- MATLAB for Machine Learning
- Building Wireless Sensor Networks Using Arduino
- Android開發三劍客:UML、模式與測試
- R數據科學實戰:工具詳解與案例分析
- Practical Predictive Analytics
- 零基礎學Java第2版
- Hands-On Dependency Injection in Go
- INSTANT Premium Drupal Themes