有没有办法在SML / NJ中获得二元运算符的Curried形式?

时间:2009-09-06 23:49:41

标签: operators sml currying smlnj

例如,而不是

- 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

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

2 个答案:

答案 0 :(得分:5)

您可以编写一个用于解释函数的辅助函数:

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

答案 1 :(得分:2)

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

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

或切换到Haskell。

编辑:我已经考虑过了,现在知道为什么一个与另一个不一样了。在SML中,几乎所有用于实际接受一个参数的函数。事实上,大多数情况下你实际上传递了一个包含多个元素的元组。仍然,元组是单个值,并由函数处理。你不能将这样的函数传递给部分元组。它既可以是整个元组,也可以不是。

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