函数中的ML变量

时间:2014-10-27 04:04:43

标签: function variables helper sml ml

我似乎无法找到这个看似简单的SML问题的简单答案。我有代码:

    fun inde(x, y, L) = if null L then nil else
    if x=hd(L) then y+1::inde(x,y+1,tl L) else
    inde(x,y+1,tl L);

我希望y成为函数外的变量,所以它将是inde(x,L)但y仍然正常计数。当我在函数外部声明它(为0)时,当递归调用函数时,它会重置为0.

如果你要运行这个当前函数,它会产生一个列表,列出列表中的x(L)。 所以inde(1,0,[1,2,2,1,1])会产生[1,4,5]

1 个答案:

答案 0 :(得分:1)

使用函数式编程风格时的惯用结构是定义一个内部函数,它接受程序员感兴趣的参数,但不是用户,然后从main函数调用内部函数:

fun inde(x : int, L) =
  let
    fun inner(list1, list2, y : int) =
      if null list1 
      then List.rev list2 
      else
        if x = hd list1
        then
          inner(tl list1, y::list2, y + 1)
        else
          inner(tl list1, list2, y +1)
    in
      inner(L,[],1)
    end

在示例函数中:

  • inner使用四个值:局部变量list1list2y。它还使用封闭范围内的x

  • inner构建(汇总)将使用list2返回的列表。它通过调用SML Basis Library中的List.rev来反转列表。这会将O(n)添加到执行时间。

  • let...in...end构造的最后一部分:inner(L,[],1)被称为"蹦床"因为代码一直到源文件的底部,然后退回它以开始执行。这是一种标准模式。

  • 请注意,我开始使用等于1的y进行迭代,而不是0.从0开始并未在原始文件中完成任何操作。