5

例如,而不是

- op =;
val it = fn : ''a * ''a -> bool

我宁愿有

- op =;
val it = fn : ''a -> ''a -> bool

用于

val x = getX()
val l = getList()
val l' = if List.exists ((op =) x) l then l else x::l

显然我可以自己做这件事,例如,

val l' = if List.exists (fn y => x = y) l then l else x::l

但我想确保我不会错过更优雅的方式。

4

2 回答 2

6

你可以编写一个辅助函数来curries一个函数:

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

然后你可以做类似的事情

val curried_equals = curry (op =)
val l' = if List.exists (curried_equals x) l then l else x::l
于 2009-09-07T00:53:02.437 回答
2

我对 SML 的了解很少,但我翻阅了 Ullman 的书,找不到将接受元组的函数转换为柯里化函数的简单方法。它们有两个不同的签名,并且彼此不直接兼容。

我认为您将不得不自己动手。

或者切换到 Haskell。

编辑:我已经考虑过了,现在知道为什么一个与另一个不同。在 SML 中,几乎所有您习惯使用的函数实际上只接受一个参数。碰巧的是,大多数时候你实际上是在传递一个包含多个元素的元组。尽管如此,元组是单个值,并且被函数视为这样。您不能将此类函数传递给部分元组。它要么是整个元组,要么什么都没有。

根据定义,任何接受多个参数的函数都是柯里化的。当您定义一个接受多个参数的函数(而不是具有多个元素的单个元组)时,您可以部分应用它并将其返回值用作另一个函数的参数。

于 2009-09-07T00:16:14.690 回答