例如,而不是

- 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

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

有帮助吗?

解决方案

您可以写一个辅助函数咖喱功能:

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

其他提示

我的SML的知识是有限的,但我通过乌尔曼书看了看,找不到一个简单的方法来转换接受一个元组作为咖喱功能的功能。它们有两个不同的签名,并且不直接与彼此相容。

我认为你将不得不推出自己的。

或切换到Haskell中。

编辑:我想过这个问题,现在知道为什么一个不一样的其他。在SML,几乎所有你习惯的功能实际上只接受一个参数。它只是恰巧,大部分的时间你实际上传递一个元组与一个以上的元素。尽管如此,一个元组是一个单一的值,由函数对待。你可以不通过这样的功能部分的元组。这是不是整个元组或什么都没有。

接受一个以上的参数是通过定义的任何功能,咖喱。当定义一个接受多个参数(相对于具有多个元件的单个元组)的功能,就可以部分地应用它,并使用它的返回值作为参数向另一功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top