2012-09-28 42 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 

和高阶功能是万一另一种选择,你想使用它们。