询问ML递归函数

时间:2012-09-28 02:16:58

标签: sml 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?

2 个答案:

答案 0 :(得分:3)

我不知道ml但基本上没有做其他事情你需要这样做:

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了解得更多:)

答案 1 :(得分:3)

您忘记在条件所在的列表尾部递归调用该函数。

在ML中,您几乎从不使用hdtl,而是使用模式匹配。并且您可以在元组上进行模式匹配以获得更多可读性:

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

List structure上的高阶函数是您想要使用它们的另一种选择。