2013-02-01 31 views
0

我在重寫使用更高階函數的方法時遇到了一些問題。這裏的嘗試(它編譯但不運行它工作正常):如何將列表減少爲單個選項值

fun lookup2 key hash = 
    List.foldr (fn ((k, v), r) => if k = key then SOME v else r) NONE hash; 

背景:

的想法是,有像這樣的哈希,我查找了通過字符串鍵一個int選項:

- val h = [("a", 5), ("b", 4)]; 
- lookup "a" h; 
val it = SOME 5 : int option 

我寫了一個非常有效:

fun lookup _ nil = NONE 
    | lookup key ((k, v)::xs) = if k = key then SOME v else lookup key xs; 

但是我想重寫它以幫助熟悉sml。我有一個鬼鬼祟祟的懷疑,我不很明白foldr ...


我的錯誤 - 我不小心用不同lookup2覆蓋它。它按預期工作。

回答

1

是什麼你正在尋找不List.foldr,但List.find

找到FL

將f每個元素x列表L的,由左到右,直到X計算爲真正。如果存在這樣的x,它返回SOME(x);否則返回NONE。

source

現在,你可以做到以下幾點:

fun lookup key hash = Option.map (fn (_,v) => v) 
    (List.find (fn (k,_) => k = key) hash); 

List.find從數組或也NONE(key, val)NONE,並Option.map回報或者val返回匹配元組。

+0

@AJcodez:嘿,我更喜歡使用函數組合運算符('o')的版本!但我不得不承認這一點可能會更清楚。 – pyon

+0

啊對不起,我沒有認出它,複製/粘貼在我的機器上不起作用。隨意將它改回:) – AJcodez

+0

@AJcodez:沒關係,沒關係! – pyon