2013-10-28 53 views
0

我寫函數返回一個列表SML鑽營和遞歸

的最大值和最小值由於代碼是除了一個函數調用一樣的,我想不重複的代碼

fun cur f f2 x=case x of 
    []=>raise Empty 
    |[x]=>x 
    |x::xs=>f(x,f2(xs)) 
fun min x=cur Int.min min x 
fun max x=cur Int.max max x 

感覺有分在自己聲明不好的風格

有關如何改進代碼的任何建議?

+0

歡迎來到stackoverflow! –

回答

0

請注意,默認情況下fun是遞歸的。因此,您無需做出明確的遞歸參考:

fun cur f x = case x of 
    [] => raise Empty 
    | [x] => x 
    | x::xs => f(x, cur f xs) 
fun min x = cur Int.min x 
fun max x = cur Int.max x 

這是摺疊的一般情況。看看foldr和foldl在the standard library。還有更有效的方法來做到這一點,特別是通過使你的函數尾部遞歸。這總是一個不錯的練習!