例如,而不是
- 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
但我想确保我不会错过更优雅的方式。
答案 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。当您定义一个接受多个参数的函数(而不是具有多个元素的单个元组)时,您可以部分应用它并将其返回值用作另一个函数的参数。