SML中来自元组的“Curry”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SML中来自元组的“Curry”相关的知识,希望对你有一定的参考价值。

我试图定义一个函数包装器,用于在SML中计算元组。

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

给我错误

非标识符应用于模式。

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

我怎么能做这个工作?

答案

我试图定义一个函数包装器,用于在SML中计算元组。

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

我怎么能做这个工作?

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

curry通常做的是采用通常接受元组f的函数(x, y),而是返回一个分别取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 *)

这意味着它需要三个curried参数(xyz)的函数,并返回一个修改过的函数,其中前两个参数现在在一个元组(uncurried)中,第三个仍然是curry。这实际上是uncurry不太通用的版本。更清晰的写作方式是:

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

如果你在三个参数的函数上使用uncurry,你会得到相同的效果,但你不能在任何带有两个curried参数的东西上使用what_is_this。所以我要说这是一个不太有用的uncurry变种。

然而,还有其他更有用的curry / uncurry变体。例如,你可以制作一个将uncurry_twice转换为f x y z(uncurry_twice f) ((x, y), z),或者将uncurry3转换为f 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

以上是关于SML中来自元组的“Curry”的主要内容,如果未能解决你的问题,请参考以下文章

如何比较和搜索列表中的元素与列表 SML 中的元组

Python:用于元组的 Pandas DataFrame

来自元组的 JavaScript 变量赋值

为啥 foldl 签名是管道而不是 SML 中的元组类型?

使用 for 循环比较来自两个列表/元组的元素(在递归中)

来自元组的 Pandas DataFrame 列