如何在 F# 或任何函数式语言中柯里化第二个(或第三个、第四个……)参数?

2023-12-19

我刚刚开始使用 F#,看看如何使用柯里化将第一个参数预加载到函数中。但是如何使用第二个、第三个或任何其他参数来做到这一点呢?命名参数会让这变得更容易吗?是否有任何其他函数式语言具有命名参数或其他方式使柯里化与参数顺序无关?


通常你只使用 lambda:

fun x y z -> f x y 42

是一个类似于“f”的函数,但第三个参数绑定为 42。

您还可以使用组合器(就像有人在评论中提到 Haskell 的“翻转”),它可以重新排序参数,但我有时发现这令人困惑。

请注意,大多数柯里化函数都是这样编写的,即最有可能部分应用的参数排在第一位。

F# 为方法提供了命名参数(不是 let 绑定的函数值),但这些名称适用于“元组”参数。命名的柯里化参数没有多大意义;如果我有一个两个参数的柯里化函数“f”,我希望给定

let g = f
let h x y = f x y

那么“g”或“h”可以替代“f”,但“命名”参数使得这不一定成立。也就是说,“命名参数”与语言设计的其他方面的交互效果很差,而且我个人不知道有什么好的设计可以让“命名参数”与“第一类柯里化函数值”交互良好。

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

如何在 F# 或任何函数式语言中柯里化第二个(或第三个、第四个……)参数? 的相关文章

  • F# 中的动态编程

    实现解决问题的动态规划算法的最优雅的方法是什么子问题重叠的问题 http en wikipedia org wiki Overlapping subproblem 在命令式编程中 人们通常会创建一个按问题大小索引的数组 至少在一维 然后算法
  • Scala 函数定义参数列表中不同的括号样式

    Scala 中以下两个函数定义有什么区别 1 def sum f Int gt Int a Int b Int Int code 2 def sum f Int gt Int a Int b Int Int code SBT 的控制台 RE
  • F# 静态成员类型约束

    我正在尝试定义一个函数 factorize 它使用类似于 Seq sum 的结构类型约束 需要静态成员 Zero One 和 以便它可以与 int long bigint 等一起使用 似乎无法获得正确的语法 并且无法找到有关该主题的大量资源
  • F# 中的自定义路由事件

    我正在尝试翻译这段 C 代码 https msdn microsoft com en us library ms752288 aspx 到目前为止我的尝试 type MyButtonSimple as self inherit Button
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 我可以在 Java 8 中使用 Clojure 函数作为 Lambda 函数吗?

    我在 Clojure 中使用了许多库来生成符合 Clojure lang IFN https github com clojure clojure blob master src jvm clojure lang IFn java 界面 它
  • 使用 System.Text.Json 序列化记录成员

    我在记录中使用自我引用成员 如下所示 type Payload Id Guid member x DerivedProperty Derived Property using id x Id NewtonSoft Json会序列化这个 但是
  • 使用 elm 高阶函数处理键盘事件

    我正在尝试创建一个高阶函数来创建仅捕获特定关键代码的函数 该代码的灵感来自 EvanonEnter来自他的 todomvc 实现的函数 仅捕获 Enter 函数 onKeyCode Int gt Msg gt Attribute Msg o
  • 如何使用 FS2 中的分类器函数对对象进行分组?

    我有一个无序的流measurements 我想将其分组为固定大小的批次 以便以后可以有效地保留它们 val measurements for id lt Seq foo bar baz value lt 1 to 5 yield id va
  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • Haskell 有 takeUntil 函数吗?

    目前我正在使用 takeWhile x gt x 1 x 89 l 从列表中获取最多为 1 或 89 的元素 但是 结果不包括这些标记值 Haskell 是否有一个标准函数可以提供这种变化takeWhile结果中包含哨兵 到目前为止 我对胡
  • 在类型扩展中重载运算符

    好的 所以我基本上尝试将绑定运算符添加到选项类型中 似乎我尝试的所有内容都有一些不明显的警告阻止我这样做 我怀疑这与 NET 类型系统的限制有关 并且可能与类型类无法在用户代码中实现的原因相同 不管怎样 我已经尝试了一些事情 首先 我尝试了
  • 如何在 F# 中定义这种惰性(无限?)数据结构

    我在定义以下简单文本光标时遇到问题 该光标由元组表示 其中第一个元素是当前字符 如果函数获取下一个元素或崩溃 则第二个元素是 let rec nextAt index text if index lt String length text
  • 检查对象是否是字符串列表的列表?

    是什么elegant检查对象是否是字符串列表列表的方法 没有嵌套循环 也许这里必须是构造结构化迭代的常规方法 UPD 像这样的东西 l a b c d 1 3 e 2 f def recurse iterable levels result
  • Haskell 中的参数数量和无点 [重复]

    这个问题在这里已经有答案了 对于多重模式匹配 不同数量的参数是不可能的 即使是无点的 foo True b b 2 foo id 例如 不起作用 但 foo True 2 foo id 做 有时我们只能在函数的一部分使用 point fre
  • 使用派生类的 C++ 命名参数实现

    我正在尝试为项目的某些类创建一个类似命名参数的构造函数 我这样做的方法是定义一个类代理 它将保存参数并将该代理的实例传递给我的类的构造函数 一切都很顺利 直到我不得不派出一门课程 基本上我想 我将从基类代理派生新的派生类代理 这也有效 但前
  • C++0x (C++11) 作为函数式语言?

    我想知道 C 0x C 11 带有 lambda 和完美转发 是否是一种函数式语言 的超集 函数式语言有什么特性是 C 所没有的吗 函数式编程范式将计算建模为集合之间的关系 因此本质上是声明性的 然而 在实践中 我们通常认为函数是命令式的
  • F# 生成日期序列/数组

    在 F 中我可以轻松做到 let a 1 10 那我为什么不能做 let a DateTime Parse 01 01 2012 let b DateTime Parse 01 01 2020 let dateList a b 它给出了一个
  • F# 方法返回 null 而不是 Option

    我开发F 应用 net 4 6 1 on VS2015 我有方法 type CommonHelper static member SideEffectOnNull act x if x null then act x else x stat
  • Haskell 真的是纯粹的吗(有任何语言可以处理系统外的输入和输出)吗?

    在谈到函数式编程中的 Monad 后 该功能是否真的使语言变得纯粹 或者它只是黑板数学之外的现实世界中计算机系统推理的另一张 免狱卡 EDIT 这不是有人在这篇文章中所说的火焰诱饵 而是一个真正的问题 我希望有人能用它来击倒我并说 证明 它

随机推荐