【问题标题】:SML-Functional ProgrammingSML-函数式编程
【发布时间】:2013-10-08 05:50:31
【问题描述】:

我想用 SML 编写一个类似 C++ 的代码

i=i+1;

i++

简而言之,我想计算当 if 语句为真时循环(递归)运行了多少次。 进一步阐明它。我有问题的代码如下所示:

val i = 0;
fun <function_name>() = 
   if <condition>
   then (i+1;
         <recursive_expression>)
  else expression

但这里的问题是,由于 SML/NJ 中的不变性,无论递归执行多少次,答案总是 1。

任何想法都会有所帮助!

【问题讨论】:

  • 你能发布你的整个代码吗?

标签: functional-programming immutability sml


【解决方案1】:

由于您没有发布整个代码,我在这里创建了一个简单的代码:

fun evens(int_list: int list) =
    let fun evens_helper(int_list: int list, times: int) =
    if null int_list
    then times
        else if null (tl int_list)
    then 
        if (hd int_list) mod 2 = 0
        then 1
        else 0
    else if (hd int_list) mod 2 = 0
    then 1 + evens_helper(tl int_list, times + 1)
    else evens_helper(tl int_list, times)
    in evens_helper(int_list, 0)
    end

要做你需要的,最简单的事情是在你的函数中创建一个辅助函数,它与原始函数完全相同,但多了一个参数(你的计数器)。如果您的计数器应该被激活,那么您使用计数器 +1 调用递归调用。如果不想被激活,请使用相同的计数器值调用递归函数。

如果您还没有得到它,请发布您的整个代码,以便我看到它。

【讨论】:

    【解决方案2】:

    你的 if/then 表达式应该有类似的类型。这是一个可能对您有所帮助的简单示例。

    fun how_many_evens (from,to)=
        let fun count_even (m,count) =
        if m > to then count
            else
            if m mod 2 = 0 then count_even(m+1,count+1)
            else count_even(m+1,count)
    
        in
            count_even (from,0)
        end
    

    【讨论】: