2012-09-28 44 views
2

我一直在用ml函數做一些事情,並且遇到了一些煩人的事情。詢問ML遞歸函數

我會用簡單的代碼來解釋它。 例如,如果有一個列表(int * int),並且我想檢查是否有一些元組中包含3的元組。

L = [(1,2),(2,3),(3,5),(3,4)] 

所以在這個名單,我想5和4 然而,ML,功能是遞歸的,所以如果我寫這樣的代碼。

fun a(list) = 
    if #1(hd(list)) = 3 then #2(hd(list)) 
    else a(tl(list)) 
在這個簡單的功能

,它可以得到5而不是4因爲一旦檢測到(3,5)滿足條件則返回5和函數完成。

有沒有什麼辦法讓4?

回答

3

我不知道毫升,但基本上不是做其他的,你需要做的是:

fun a(list) = 
    if list = nil then nil 
    else 
    if #1(hd(list)) = 3 
    then 
     #2(hd(list)) :: a(tl(list)) 
    else 
     a(tl(list)) 

(我漸漸編輯這個反應,因爲我瞭解ML :)

3

你忘了在條件列表的尾部遞歸地調用函數。

在ML中,您幾乎從不使用hdtl,而是使用模式匹配。你可以模式匹配的元組的更多可讀性:在List structure

fun filter [] = [] 
    | filter ((x, y)::xys) = if x = 3 
          then y::(filter xys) 
          else filter xys 

和高階功能是萬一另一種選擇,你想使用它們。