functional-programming - "Curry"来自 SML 中的元组

标签 functional-programming sml mosml

我正在尝试定义一个函数包装器,以柯里化(Currying) SML 中的元组。

fun curry f = fn (x, y) z => f x y z;

给我错误

Non-identifier applied to a pattern.

我是 ML 的新手,不确定为什么 fn 中的模式匹配不起作用。

我怎样才能使它工作?

最佳答案

I am trying to define a function wrapper that curries a tuple in SML.

fun curry f = fn (x, y) z => f x y z;

How could I make this work?

SML 中的闭包不允许有多个参数,但您可以将它们嵌套起来。

curry 通常做的是接受一个通常接受元组 (x, y) 的函数 f 并返回一个修改后的函数xy 分开。以下是一些定义 curry 的等效方法:

fun curry f x y = f (x, y)
fun curry f x = fn y => f (x, y)
fun curry f = fn x => fn y => f (x, y)
val curry = fn f => fn x => fn y => f (x, y)

相反,uncurry 取而代之的是一个函数 f,它分别接受 xy 并返回修改后的采用(x, y) 的函数。下面是一种编写 uncurry 的方法:

fun uncurry f (x, y) = f x y

很容易混淆两者。

修复您编写的函数以便它编译的一种方法是插入一个额外的 => fn:

fun what_is_this f = fn (x, y) => fn z => f x y z
                            (* ^- there *)

在给它起名字之前,我们先分析一下它的作用。它具有类型签名:

fn : ('a -> 'b -> 'c -> 'd) -> 'a * 'b -> 'c -> 'd
                  (* now a tuple -^    ^- still curried *)

意味着它接受三个柯里化(Currying)参数(xyz)的函数并返回一个修改后的函数,其中前两个参数现在在一个元组中(未柯里化(Currying)),第三个仍然是柯里化(Currying)的。这实际上是 uncurry 的不太通用的版本。更清晰的写法是:

fun what_is_this f (x, y) z = f x y z

如果你对三个参数的函数使用 uncurry,你会得到同样的效果,但是你不能对任何有两个 curried 参数的函数使用 what_is_this。所以我想说这是 uncurry 的一个不太有用的变体。

curry/uncurry 还有其他更有用的变体。例如,您可以创建一个 uncurry_twicef x y z 转换为 (uncurry_twice f) ((x, y), z),或者一个 uncurry3f x y z 转换为 (uncurry3 f) (x, y, z):

fun uncurry_twice f = uncurry (uncurry f)
fun uncurry3 f (x, y, z) = f x y z

关于functional-programming - "Curry"来自 SML 中的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49124273/

相关文章:

language-lawyer - 根据定义,这个片段是否合法标准 ML?

javascript - 如何从这个 JSON 结果中过滤掉特定的地址类型而不需要空数组?

recursion - 递归绑定(bind)内的 SML 语法限制?

javascript - 使迭代在 JavaScript/JQuery 中更具功能性

sml - (SML) 将类型定义为函数并创建此类型的函数

function - PolyML 函数和类型

sml - 使用 MLton 和 MosML 退出进程(缺少进程模块)

python - 在 python 中强制执行副作用

functional-programming - 什么是依赖类型?