第九章 柯里化
什么是柯里化
DDDD
柯里化实践
识别函数:
- 有多个参数
- 似乎常只使用部分参数
- 参数上天然可以分阶段传入
定义函数:
- 将转化为一系列嵌套的单参数函数。每个函数返回另一个函数,直到所有参数都被传入
柯里化会导致一些繁琐,但在一些情况下,这会非常实用
如配置
public static Func<NotificationType, Func<int, Action<string>>> CurryNotificationConfig() { return notificationType => maxNotificationsPerMinute => recipientEmail => { Console.WriteLine($"配置 {notificationType} 通知:收件人 {recipientEmail},每分钟最多 {maxNotificationsPerMinute} 条"); }; } var configureNotifications = CurryNotificationConfig();
var configureEmailNotifications = configureNotifications(NotificationType.Email);
var configureUserNotifications = configureEmailNotifications(10); configureUserNotifications("alice@example.com"); configureUserNotifications("bob@example.com");
var configureModeratorNotifications = configureEmailNotifications(50); configureModeratorNotifications("moderator1@example.com");
var configureAdminNotifications = configureEmailNotifications(100); configureAdminNotifications("admin1@example.com");
|
按钮
public static Func<string, Func<EventArgs, void>> CurryButtonClickHandler() { return buttonName => eventArgs => { Console.WriteLine($"按钮 {buttonName} 被点击!"); }; } var handleButtonClick = CurryButtonClickHandler();
var handleSaveClick = handleButtonClick("保存"); var handleCancelClick = handleButtonClick("取消");
saveButton.Click += (sender, e) => handleSaveClick(e); cancelButton.Click += (sender, e) => handleCancelClick(e);
|
日志
public static Func<string, Func<string, void>> CurryLogMessage() { return logLevel => message => { Console.WriteLine($"{logLevel}: {message}"); }; } var logMessage = CurryLogMessage(); var logError = logMessage("ERROR"); var logWarning = logMessage("WARNING");
logError("发生了一个错误。"); logWarning("这是一个警告信息。");
|
优缺点
优点:
缺点: