ML 中高阶函数中的 curry 和 uncurry 是什么

2024-05-16

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 。谁能解释一下这些吗?

另外,下面两行是什么意思?

(1) compose (compose, uncurry compose)
(2) compose (uncurry compose, compose)

如果你看一下类型,你就会清楚地看到什么curry and uncurry does.

请记住,可以定义将其参数作为一个大元组或多个参数的函数(实际上,它变成了一个函数“链”,每个函数接受 1 个参数,请参阅此wiki http://en.wikipedia.org/wiki/Currying):

fun foo (a,x) = a*x+10
fun bar a x = a*x+20

它们的类型之间的差异显而易见:

val foo = fn : int * int -> int
val bar = fn : int -> int -> int

The curry函数将其参数作为元组的函数“转换”为每个函数接受 1 个参数的函数“链”。当我们想要编写一系列函数,其中一些函数部分应用了参数时,这特别方便。看看类型如何foo被改变:

- curry foo;
val it = fn : int -> int -> int

现在我们可以尝试组合这两个函数:

- (curry foo 5 o bar 1) 4;
val it = 130 : int

前 4 个应用于bar 1作为论点x,那么该计算的结果 (bar 1 4) 给出为x论证foo.

明显地uncurry用于逆过程:

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

ML 中高阶函数中的 curry 和 uncurry 是什么 的相关文章

  • SML/NJ:如何使用哈希表?

    我真的很想在 SML 中创建一个哈希表 似乎 SML NJ 中已经有一个结构 问题是 我该如何使用它 我还没有完全理解如何在SML中使用结构 并且我读过的书中的一些非常基本的示例给了我错误 我什至不知道如何纠正 所以使用HashTable结
  • 在 Python 中如何使用函数(回调)作为另一个函数的参数?

    假设我有一些代码 例如 def myfunc anotherfunc extraArgs somehow call anotherfunc here passing it the extraArgs pass 我想传递另一个现有函数作为an
  • 高阶函数有哪些有趣的用途?

    我目前正在学习函数式编程课程 我对高阶函数和一等公民函数的概念感到很有趣 然而 我还想不出许多实际有用的 概念上令人惊奇的或只是简单有趣的高阶函数 除了典型的 相当沉闷的map filter等功能 您知道此类有趣函数的示例吗 也许是返回函数
  • 权重偏左堆:自上而下版本合并的优点?

    我正在自学 它要求推理并实现一个偏向权重的左堆 这是我的基本实现 3 4 b functor WeightBiasedLeftistHeap Element Ordered Heap struct structure Elem Elemen
  • 如何在 Swift 4 中使用函数柯里化

    我试着去理解函数柯里化教程 https robots thoughtbot com introduction to function currying in swift但该代码似乎已经过时了 关于函数柯里化仍然不太清楚 我尝试使用这个功能
  • 理解 scala:柯里化

    我最近开始学习 Scala 并遇到了柯里化 从这个答案post https stackoverflow com questions 17768686 currying example in scala 这段代码片段 def sum a In
  • 柯里化有什么好处?

    我认为我不太理解柯里化 因为我看不到它可以提供任何巨大的好处 也许有人可以用一个例子来启发我 证明它为什么如此有用 它真的有好处和应用吗 还是只是一个被过度重视的概念 两者之间有细微差别currying and 部分应用 尽管它们密切相关
  • StandardML 中的 y 组合器

    我知道我可以用 SML 编写 y 组合器 如下所示 首先声明一个新的数据类型来绕过由于循环而导致的类型不匹配 datatype a mu Roll of a mu gt a val unroll fn Roll x gt x 现在您可以轻松
  • Java 支持柯里化吗?

    我想知道是否有任何方法可以在 Java 中实现这一点 我认为如果没有对闭包的原生支持 这是不可能的 Java 8 2014 年 3 月 18 日发布 确实支持柯里化 示例 Java 代码发布于Missingfaktor 的回答 https
  • 标准机器学习中的结构比较

    我似乎找不到关于为什么这不起作用的参考 2000 1 lt 2000 1 stdIn 18 1 18 18 Error operator and operand don t agree overload operator domain Z
  • 如何使用 ES6 Fat Arrow .filter() 对象数组

    我正在尝试使用 ES6 箭头函数 filter返回成人 杰克和吉尔 看来我不能使用 if 语句 为了在 ES6 中执行此操作 我需要了解什么 var family name Jack age 26 name Jill age 22 name
  • 高阶函数和柯里化函数之间的区别

    我在读一本书 使用 F 进行函数式编程 https rads stackoverflow com amzn click com 1107684064 which 第 33 页 在 部分高阶函数的声明 我们已经看到了高阶内置函数 例如 和 并
  • 在 SML 中使用foldr 连接字符串

    我正在尝试声明一个函数 字符串列表 gt 字符串 例如输入 Chicago city USA 应该返回 Chicago city USA 到目前为止我所做的是 fun gather ts foldr op ts 这似乎有点符合 但问题是 我
  • 运营商部分应用

    如果我想在字符末尾添加一个空格以返回列表 如果我不传递任何参数 我将如何通过部分应用程序来完成此操作 还有类型是 space Char gt Char 由于使用 和 运算符出现 解析错误 我在末尾添加空格时遇到问题 到目前为止我所拥有的是
  • 作用域函数 apply/with/run/also/let:它们的名字从何而来?

    有很多博客文章 例如this https dzone com articles examining kotlins also apply let run and with intentions 关于标准库函数的用法apply with ru
  • 通过 Emacs 评估 ghci 或 Hugs 中的缓冲区

    在 Emacs 中使用 sml mode 我已经能够使用以下命令将缓冲区内容直接发送到较差的 SML 进程C c C b 现在我只想用 Haskell 做同样的事情 Haskell 模式似乎不支持这一点 所以我想知道 使用 Emacs 和
  • Swift 中的柯里函数

    我想创建一个返回柯里函数的函数 如下所示 func addTwoNumbers a Int b Int gt Int return a b addTwoNumbers 4 b 6 Result 10 var add4 addTwoNumbe
  • Python 柯里化任意数量的变量

    我正在尝试使用柯里化在 Python 中进行简单的函数添加 我找到了这个咖喱装饰器here https gist github com JulienPalard 021f1c7332507d6a494b def curry func def
  • 使用默认值压缩而不是删除值?

    我正在 haskell 中寻找一个函数来压缩两个长度可能不同的列表 我能找到的所有 zip 函数都只是删除列表中比其他列表长的所有值 例如 在我的练习中 我有两个示例列表 如果第一个比第二个短 我必须用 0 填充 否则我必须使用 1 我不允
  • 函数式语言与语言实现的角度有何不同

    出现了全新的 函数式编程 范式 与过程式编程相比 它需要彻底改变思维模式 它使用高阶函数 纯度 单子等 我们通常在命令式和面向对象语言中不会看到这些 我的问题是如何执行这些语言与命令式或面向对象语言的不同之处在于 例如内存管理或指针等内部结

随机推荐