2009-09-06 59 views
3

例如,而不是有沒有辦法在SML/NJ中獲得二元運算符的Curried形式?

- 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 

但我想確保我不會錯過更優雅的方式。

回答

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 
+0

+1。反過來,你可以寫出'fundefur f(x,y)= f x y'。 (這對於調用像'foldl'這樣的功能是非常有用的,它需要一個二進制函數。) – ruakh 2015-09-21 02:47:20

2

我對SML的知識很少,但是我看了Ullman的書,找不到一個簡單的方法將接受元組的函數轉換爲curried函數。他們有兩個不同的簽名,並不直接相互兼容。我想你會不得不推出自己的。

或切換到Haskell。

編輯:我想過了,現在知道爲什麼一個是不一樣的。在SML中,幾乎所有用於實際接受一個參數的函數。恰恰相反,大多數情況下,你實際上是通過一個元組來傳遞一個元組。不過,一個元組是一個單一的值,並被這個函數處理。你不能將這樣的函數傳遞給部分元組。它可以是整個元組,也可以不是。

根據定義,任何接受多個參數的函數都是curried。當你定義一個接受多個參數的函數(而不是一個具有多個元素的元組)時,你可以部分地應用它並使用它的返回值作爲另一個函數的參數。

+1

幽州「接受多個參數,通過定義的任何功能,令行禁止」。那麼,我認爲類型('a - >'b - >'c)的函數也只接受一個參數('a),它恰好返回了另一個類型爲('b - >'c )。這是由於「 - >」運算符是右聯合的:('a - >'b - >'c)=('a - >('b - >'c))。部分應用程序就是這個的結果。函數應用程序是左關聯的,因此(myFun arg1 arg2 arg3)=(((myFun arg1)arg2)arg3)。 – harms 2009-11-11 15:28:42

相關問題