有没有办法让SML / NJ二进制运算符的咖喱形式?
题
例如,而不是
- 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,几乎所有你习惯的功能实际上只接受一个参数。它只是恰巧,大部分的时间你实际上传递一个元组与一个以上的元素。尽管如此,一个元组是一个单一的值,由函数对待。你可以不通过这样的功能部分的元组。这是不是整个元组或什么都没有。
接受一个以上的参数是通过定义的任何功能,咖喱。当定义一个接受多个参数(相对于具有多个元件的单个元组)的功能,就可以部分地应用它,并使用它的返回值作为参数向另一功能。
不隶属于 StackOverflow