C# 中的正确柯里化

2024-03-12

给定一个方法DoSomething它接受一个(无参数)函数并以某种方式处理它。有没有比下面的代码片段更好的方法来为带有参数的函数创建“重载”?

public static TResult DoSomething<TResult>(Func<TResult> func)
{
    //call func() and do something else
}

public static TResult DoSomething<T0, TResult>(
    Func<T0, TResult> func,
    T0 arg0)
{
    return DoSomething(() => func(arg0));
}

public static TResult DoSomething<T0, T1, TResult>(
    Func<T0, T1, TResult> func,
    T0 arg0, T1 arg1)
{
    return DoSomething(arg => func(arg, arg1), arg0);
}

public static TResult DoSomething<T0, T1, T2, TResult>(
    Func<T0, T1, T2, TResult> func,
    T0 arg0, T1 arg1, T2 arg2)
{
    return DoSomething(arg => func(arg, arg1, arg2), arg0);
}

编辑:正如评论中所指出的,这是部分应用而不是柯里化。我写了一个关于我对差异的理解的博客文章 http://codeblog.jonskeet.uk/2012/01/30/currying-vs-partial-function-application/,人们可能会觉得有趣。

嗯,这并不是特别不同 - 但我将柯里化部分与“调用 DoSomething”部分分开:

public static Func<TResult> Apply<TResult, TArg> (Func<TArg, TResult> func, TArg arg)
{
    return () => func(arg);
}

public static Func<TResult> Apply<TResult, TArg1, TArg2> (Func<TArg1, TArg2, TResult> func,
                                                          TArg1 arg1, TArg2 arg2)
{
    return () => func(arg1, arg2);
}

// etc

Then:

DoSomething(Apply(foo, 1));

这样您就可以在其他情况下重用柯里化代码 - 包括您不想立即调用新返回的委托的情况。 (例如,您可能想稍后对其进行更多柯里化。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中的正确柯里化 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 将行旋转为列

    我有一个 SQL 查询 它生成以下内容 col1 col2 col3 item1 key1 value1 item1 key2 value2 这是查询 SELECT t1 col1 t2 col2 t2 col3 FROM table1 t
  • 从窗口服务显示窗口窗体

    我正在创建一个窗口服务 我的要求是按特定时间间隔显示 Windows NT 服务的窗口窗体 出于测试目的 我只想在服务启动时显示表单 protected override void OnStart string args eventLog1
  • 如果图像是背景,TabControl 会闪烁

    我注意到 如果我在具有图像背景的面板中有一个 TabControl 当鼠标悬停在选项卡上时 它会闪烁并重绘 有没有解决方法可以防止这种情况发生 我看到了 发生这种情况是因为 TabControl 通过要求父控件在其自己的窗口内绘制自身来部分
  • Swift - 如果小数等于 0,如何从浮点数中删除小数?

    我显示的距离为一位小数 如果它等于 0 例如 1200 0Km 我想删除该小数 我该如何快速做到这一点 我这样显示这个数字 let distanceFloat Float currentUser distance as NSString f
  • Google Chrome 的 Javascript 控制台键盘快捷键

    我想使用调试我的 javascript 应用程序谷歌浏览器3的开发者工具 一切都很好 直到我真正想开始调试 我可以设置断点等 但我不想使用鼠标而是使用键盘进行调试 In Firefox Firebug I can use F10 F11 a
  • HttpClient.GetAsync 在具有锁屏访问以及 TimeTrigger 或 MaintenanceTrigger 的后台任务中失败

    在 Windows 8 Metro 应用程序的后台任务中运行时 Client GetAsync 对我来说似乎失败 我尝试同时使用 TimeTrigger 和 MaintenanceTrigger 看来也不例外 调试它时 它只是在该行退出 如
  • 具有多个选项的警报

    只是想知道 是否可以创建具有多个选项的警报 例如 在 Facebook 中 当您在未完成输入消息的情况下尝试关闭选项卡 窗口时 会弹出一条带有 离开此页面 和 留在此页面 选项的警报 以表单为例 您正在寻找 window onbeforeu
  • 在机器人框架中连接两个字符串的最简单方法。?

    给定两个字符串 a b 连接它们并分配给机器人框架中的新变量的最简单方法是什么 我尝试了这种简单的Pythonic方式 但它不起作用 var a b 您可以使用Catenate http robotframework org robotfr
  • 适用于 iPhone 的 Google Talk API

    有谁知道如何使用 GData API 连接到 Google Talk 是否有更好的 iphone 开发 API 用于连接 Google Talk 我一直在查看为 API 下载的示例 但没有看到任何支持 This http code goog
  • 用于演示的 R 演示 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 计算 3D 平面的 Voronoi 图

    是否有代码 库可以计算 3D 平面 平行四边形 的 Voronoi 图 我检查了 Qhull 它似乎只能处理点 在它的示例中 Voro 可以处理不同大小的球体 但我找不到任何多边形 在这张图片中 3d 中的样本平面 https i stac
  • Ruby 无法解析 CSV 文件:CSV::MalformedCSVError(第 1 行中的非法引用。)

    Ubuntu 12 04 LTS Ruby ruby 1 9 3dev 2011 09 23 修订版 33323 i686 linux 轨道 3 2 9 以下是我收到的 CSV 文件的内容 date time settlement id t
  • oAuth 和 Codeigniter 与 MongoDB

    我正在使用 Alex Bilbie 制作的 Codeigniter 的 oAuth 库 它是为 MySQL 设计的 有人用过 MongoDB 吗 我将尝试将其 转换 为 MongoDB 但存储库中有很多文件 服务器设置只需要其中很少的文件
  • 从不平衡二叉树中随机选择一个节点

    我的一位朋友遇到了以下面试问题 我们都不太确定正确答案是什么 有谁知道如何解决这个问题 给定一个不平衡二叉树 描述一种随机选择节点的算法 使得每个节点被选择的概率相等 您只需遍历树一次即可完成此操作 该算法与列表相同 当您看到树中的第一个项
  • 您可以使用 POST 而不是 GET 进行 struts2 操作重定向吗?

  • MySQLDataReader在c#中检索Null值问题

    我目前正在开发一个 C 项目 该项目将导出 MySQL 数据 导出适用于服务器内的任何数据库 因此我不会知道表中的字段和数据类型 也不会知道表中的字段是否允许空值 在测试过程中 我发现导出工作正常 但如果字段允许 null 则当 mysql
  • 康威与 Python 的生命游戏

    我喜欢上了 Conway 的 生命游戏 并开始尝试用 Python 编写它 目前我还没有为程序的边界编写任何代码 所以我只是就我现在拥有的东西寻求帮助 我在初始化 闪烁器 阵型时似乎遇到了麻烦 它没有像应有的那样振荡 而是似乎将自己变成了立
  • 使用 buildozer 打包 kivy 应用程序时如何修复“java.lang.module.FindException:未找到模块 java.se.ee”错误

    我正在尝试打包我的 kivy 应用程序 python3 但是当我运行命令时buildozer v android debug看到这个错误 Cwd home javier buildozer android platform android
  • client-go:将 kubernetes json 文件解析为 k8s 结构

    我想解析 kubernetes 清单文件 json yaml 并能够将它们转换为 k8s 结构 以便稍后操作它们 我知道有 NewYAMLOrJSONDecoder Decode 函数 https github com kubernetes
  • C# 中的正确柯里化

    给定一个方法DoSomething它接受一个 无参数 函数并以某种方式处理它 有没有比下面的代码片段更好的方法来为带有参数的函数创建 重载 public static TResult DoSomething