反向柯里化?

2024-02-20

我想以某种方式组合函数。请考虑伪代码(而不是 F#)中的这 2 个函数

F1 = x + y
F2 = F1 * 10 // note I did not specify arguments for F1, 'reverse curry' for lack of a better word

我希望 F# 做的是弄清楚,因为

let F1 x y = x + y
//val F1 : int -> int -> int

代码let F2 = F1 * 10会给我与 F1 相同的签名:val F2 : int -> int -> int,并调用F2 2 3结果是 50: (2 + 3) * 10。这相当聪明......

所发生的情况完全不同。第一行按预期进行:

let F1 x y = x + y
//val F1 : int -> int -> int

但是当我添加第二行时let F2 = F1 * 10它抛弃了 F#。它抱怨说the type int does not match the type 'a -> 'b -> 'c现在的F1requires member ( + ).

我当然可以这样拼写:

let F1(x, y) = x + y
let F2(x, y) = F1(x, y) * 10

但现在我可能已经使用了 C#,我们已经不再那么遥远了。元组参数在很大程度上破坏了 F# 的优雅。另外,我的实际函数 F1 和 F2 的参数远多于 2 个,所以这让我眼花缭乱,这正是我想通过使用 F# 来避免的。这样说会更自然:

let F1 x y = x + y
let F2 = F1 * 10

有什么办法我可以(几乎)做到这一点吗?

额外加分:这些错误消息到底是怎么回事?为什么第二行let F2 = F1 * 10改变第一个打字?

预先感谢您的想法,

Gert-Jan

update两种方法(几乎)可以实现所描述的功能。

一种使用元组。第二行第一行看起来有点古怪,但效果很好。小缺点是我现在不能使用柯里化,否则我将不得不添加更奇怪的代码。

let F1 (a, b) = a + b
let F2 = F1 >> (*) 10

F2(2, 3) // returns 50

另一种方法是使用记录。这更直接一些,乍一看更容易理解,但需要更多的代码和仪式。确实消除了 F# 的一些优雅,看起来更像 C#。

type Arg (a, b) =
    member this.A = a
    member this.B = b

let F1 (a:Arg) = a.A + a.B
let F2 (a:Arg) = F1(a) * 10

F2 (Arg(2, 3)) // returns 50

一般来说,这没有任何模式。使用组合器(例如curry and uncurry)如拉斯曼斯建议的那样是一种选择,但我认为结果比显式版本可读性较差且更长。

如果您经常使用这种特定模式,您可以定义一个运算符来将函数(带有两个参数)乘以标量:

let ( ** ) f x = fun a b -> (f a b) * x

let F1 x y = x + y
let F2 = F1 ** 10

不幸的是,您无法添加标准数字运算符的实现(*等)到现有类型(例如'a -> 'b -> int)。然而,这是一个相当频繁的请求(并且它对于其他事情很有用)。或者,您可以将函数包装到某个提供重载数字运算符的对象中(并包含一些Invoke运行该函数的方法)。

我认为一个合适的名称是“提升”——你正在提升*运算符(处理整数)到处理返回整数的函数的版本。它类似于在 C# 编译器中使用时完成的提升*使用可为 null 的类型。

解释错误消息 - 它抱怨表达式F1 * 10:

错误 FS0001:类型 'int' 与类型 ''a -> 'b -> 'c' 不匹配

我认为这意味着编译器正在尝试寻找实例化*操作员。从右边可以看出,这应该是int,所以它认为左侧也应该是int- 但它实际上是两个参数的函数 - 就像'a -> 'b -> c'.

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

反向柯里化? 的相关文章

  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • ML 中高阶函数中的 curry 和 uncurry 是什么

    fun curry f x y f x y fun uncurry f x y f x y fun compose f g x f g x 我了解 compose 函数 但不太了解 ML 中的 curry 和 uncurry 谁能解释一下这
  • 正确使用术语 Monoid

    从下面的例子来看 我认为这样的说法是正确的String在串联运算下定义了一个幺半群 因为它是关联二元运算 并且String碰巧有一个身份元素 它是一个空字符串 scala gt Jane Doe Jane Doe res0 Boolean
  • std::bind 重载解析

    下面的代码工作正常 include
  • 为什么 Javascript 函数在实例化时的行为与执行时的行为不同?

    我来自 C PHP 并试图了解 Javascript 的想法 即函数是变量 对象并且具有准构造函数等 任何人都可以解释为什么以下代码会起作用 即 为什么实例化变量 函数时不显示 2 test 为什么执行变量 函数时不显示 1 test co
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 使用fold_left/right反转OCaml中的列表

    更新 解决方案 感谢 jacobm 的帮助 我想出了一个解决方案 Folding Recursion let reverse list 3 theList List fold left fun element recursive call
  • 你能在 scala 中使用 varargs 柯里化一个函数吗?

    我正在考虑如何用可变参数柯里化一种方法 然后我意识到我什至不知道如何去做 理想情况下 它应该让您可以随时开始使用它 然后以可迭代结束 def concat strs String strs mkString val curriedConca
  • 如何使用 .Net Core 和 VSCode 在调试模式下执行测试?

    如何使用 Net Core 和 VSCode 在调试模式下执行测试 我当前正在命令行上运行以下命令 dotnet Test 但是 这不是在调试模式下执行测试 我要附加调试器吗 如果是这样 怎么办 如有必要 请将测试项目转换为控制台应用程序
  • 使用 leftOuterJoin,不需要 .DefaultIfEmpty()

    的文档leftOuterJoin MSDN 上的查询表达式 http msdn microsoft com en us library hh225374 aspx通过样本反复暗示 当使用leftOuterJoin on into 你仍然必须
  • 你为什么决定“反对”使用 Erlang?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 你是否真的 尝试过 意味着在其中编程 而不仅仅是阅读有关它的文章 Erlang并决定在项目中不
  • 如何编写一个计算表达式生成器来累积值并允许标准语言构造?

    我有一个计算表达式生成器 可以随时生成值 并且有许多自定义操作 但是 它不允许标准 F 语言构造 并且我在弄清楚如何添加此支持方面遇到了很多麻烦 举一个独立的例子 下面是一个非常简单且毫无意义的构建 F 列表的计算表达式 type Item
  • 通过消除嵌套的 for 循环来改进此代码

    R 包corrplot除其他内容外 还包含这个漂亮的功能 cor mtest lt function mat conf level 0 95 mat lt as matrix mat n lt ncol mat p mat lt lowCI
  • 如何为 HOC 创建共享状态?

    我创造了LoadBookHOC包裹着BookDetails and BookSummary成分 LoadBookHOC js const LoadBookHOC InnerComponent gt class LoadBook extend
  • 为什么无法在 F# 项目中添加子文件夹?

    在大多数 NET项目中 我可以使用文件夹来组织代码文件 在 C 中 我不能 但过滤器最终会扮演相同的角色 但是 在 Visual Studio 2010 中的 F 中 我不能 每个代码文件都直接显示在项目目录中 为什么这个功能不可用 组织包
  • true 和布尔列表 f# 的长度

    直接使用递归 写一个函数truesAndLength bool list gt int int那 返回列表的长度 在该对的第一个组件中 以及列表的数量 列表中正确的元素 在第二个组件中 你的函数必须只迭代 遍历列表的元素一次 请勿使用 Li
  • 相当于 Java 中 C++ 的 std::bind 吗?

    有没有一种方法可以像 C 中的 std bind 一样将 Java 中的参数绑定到函数指针 Java 中类似的东西会是什么 void PrintStringInt const char s int n std cout lt lt s lt
  • F# 匹配 ->

    我想做类似的东西 Nemerle 语法 def something match STT 1 with st Summ 2 with st AVG gt st summbycol counter STT 在 F 上 那么 F 是真的吗 没有对
  • obj[] 和 string[] 作为参数

    我在用Microsoft FSharp Reflection FSharpValue MakeUnion这需要一个Reflection UnionCaseInfo and an obj 可以为空 作为参数 但是 我得到了Type misma

随机推荐

  • Facebook/Twitter 风格照片网格风格布局[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试实现 facebook 风格的照片网格布局 我为此使用 angularjs 和 bootst
  • 使用 Google App Engine 套接字进行 DNS 查询

    我正在尝试使用 Google App Engine 的新套接字支持来执行一些 DNS 查询 我在用着dnspython http www dnspython org 执行查询 并且代码在 GAE 之外运行良好 代码如下 class DnsQ
  • 调试 IIS 网站时,ASP.NET Core 2 Web 应用程序不会加载用户机密

    注意 这个问题现已解决 请参阅我的Update 3下面为解决方案 我有一个 ASP NET Core 2 Web 应用程序 需要连接到 SQL Server 数据库 根据我的Update 2下面我正在使用 IIS 调试应用程序 我正在加载配
  • 在处理可选字段时,在 gremlin 中使用注入进行长遍历

    我正在构建一个长遍历以在一个查询中添加数百个顶点 我从官方网站上看到 推荐的方法是注入对象列表并在那里添加顶点 http tinkerpop apache org docs current recipes long traversals h
  • CSS 或 SVG 中的波浪

    我正在尝试用以下方法创建柔和的波浪CSS我遇到了一些麻烦 我现在正在使用边界半径来创建波浪 但它看起来更像云 我尝试使用transform translateZ 180deg 但是div然后颜色是颠倒的 Here s what I want
  • Bootstrap Jumbotron 底部的 CSS 箭头

    我正在尝试使用边框创建一个 css 形状来表示下图中的黑色形状 黑色形状将位于 Bootstrap 大屏幕内部 或上方 红色区域是背景图像 我一直在尝试下面的代码 它给了我一个箭头 但不是我需要的形状 也许是两个箭头 任何帮助表示赞赏 ju
  • 如何在meteor.js 中本地化(i18n) moment.js?

    如何告诉在meteor js 应用程序中使用的moment js 使用英语以外的其他语言 moment js 作为 mrt 包安装 在默认英语下运行良好 使用来自 moment js 文档的演示调用http momentjs com doc
  • 使用 NuGet.Core 以编程方式推送 NuGet 包

    我目前正在打包一些文件 并使用命令行工具将它们推送到我们一台服务器上的 NuGet 源 我没有使用命令行工具 而是使用 Nuget Core 设置了一个项目 并成功创建了一个包 我现在尝试通过 NuGet Core 将该包从我的计算机推送到
  • dbReadTable 将日期列从 SQL 数据库强制转换为字符

    我可以将日期写入 SQL 表DBI dbWriteTable 并看到该列实际上在数据库中被格式化为日期 但是当我使用DBI dbReadTable 在 R 中 相同的日期列被强制转换为字符列 如何将 SQL 表读入 R 并保留日期列格式 l
  • Grails 1.3.7 / Java 7 兼容性

    有人幸运地使用 Java 7 运行 Grails 1 3 7 应用程序吗 我创建了一个全新的 Grails 1 3 7 应用程序并尝试在 Java 7 下运行它 我收到以下错误 但该应用程序似乎运行正常 我们有一些 1 3 7 应用程序 我
  • 我是否总是需要考虑性能?

    我来自 DBA 世界 性能一直是我的痴迷 我正在转向开发 并且我总是不断地 无时无刻地思考性能 阅读 SO 有时似乎性能并不重要 例如 对于 hibernate 或任何其他 ORM 的传播者来说 作为一名开发人员 我什么时候必须考虑性能 什
  • 去除android.widget.Toolbar阴影

    使用API 21 Toolbar Toolbar Toolbar toolbar new Toolbar this toolbar showOverflowMenu 想彻底消除它的影子 setElevation 0 从那以后什么也没做get
  • UIRefreshControl背景颜色

    是否可以使 UIRefreshControl 的背景随着控件的增长而增长 我希望刷新控件有一个彩色背景 以匹配顶部单元格的背景颜色 更改表格视图的背景颜色是不可接受的 因为底部的空单元格也会有颜色 但我需要它们保持白色 苹果的邮件应用程序显
  • ((float) rand() / (float)((1 << 31) - 1)) 的含义

    我试图理解一个 C 程序 其中包含一个 h 文件 其中包含以下行 define random float rand float 1 lt lt 31 1 C程序还包括
  • 在 React Native 中面临“无法安装应用程序。请确保您有 Android 开发环境”的问题

    你能帮助我吗 我被困在反应原生中创建一个新项目 如下图所示 我能够运行旧项目 但我无法运行新项目 我已按照以下步骤操作 react native init projectName cd projectName react native ru
  • 离线同步和事件源

    我们的应用程序中基于 CRUD 的部分需要 离线双向 双向 同步 能够修改数据直到准备好然后 发布 审核日志 我正在寻找事件溯源 或 命令模式 来完成这些项目 我觉得用这个来解决 2 3 很舒服 但对于第一个项目同步还不清楚 如果每个命令都
  • Javascript:转发带有可变数量参数的函数调用[重复]

    这个问题在这里已经有答案了 我想我需要像红宝石的splat这样的东西 here function foo var result for var i 0 i lt arguments length i result arguments i r
  • 如何将 Azure AD 身份验证添加到现有 ASP.NET MVC 应用程序?

    我有一个使用 Visual Studio 2013 的现有 ASP NET MVC 应用程序 我遵循了此演练 但它在选择时只关注新的新建项目更改身份验证在项目模板中 使用 Windows Azure Active Directory 开发
  • 在ReactJS中显示来自flask send_file函数的图像

    我使用 Flask send file 将图像发送到客户端 如下所示 app route get cut image methods GET def get cut img response make response send file
  • 反向柯里化?

    我想以某种方式组合函数 请考虑伪代码 而不是 F 中的这 2 个函数 F1 x y F2 F1 10 note I did not specify arguments for F1 reverse curry for lack of a b