2

我一直在使用 ml 函数并遇到了一些烦人的事情。

我将用简单的代码来解释它。例如,如果有一个 list(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吗?

4

2 回答 2

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 的了解更多,我正在逐渐编辑此回复:)

于 2012-09-28T02:23:47.187 回答
3

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

在 ML 中,您几乎从不使用hdtl而是使用模式匹配。您可以对元组进行模式匹配以提高可读性:

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

列表结构上的高阶函数是另一种选择,以防您想使用它们。

于 2012-09-28T06:50:04.757 回答