【问题标题】: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