我是函数式编程的新手,但我有专门针对java的命令式编程经验。我想问一个值如何在smlnj迭代我知道在java上你可以使用varName + = anyNumber或varName = varName + 1.在smlnj我不知道如何做到这一点我的var值不是迭代在这里是一个我的代码样本。提前谢谢。
fun number_in_month (dates : (int*int*int) list , month : int) =
let
val total = 0;
in
let
fun check(date : (int*int*int) list , m : int) =
if #2(hd(date)) = m
then total + 1 (* this is the problem in the code i don't know
how to iterate this like "varName += 1" in java *)
else check(tl(date),m)
in
check(dates,month)
end
end
此程序将检查输入的月份中是否存在输入的日期(在列表中),并将输出该月份存在的日期。
例如:number_in_month([(year,month,day)],monthEntered) number_in_month([(2017,2,1),(2015,2,3),(2012,1,2)],2)输出必须为2,因为列表中的第一项和第二项等于monthEntered。 / p>
我的代码中的问题是它只输出1,即使我输入的所有日期都等于我输入的月份。我只是想知道为什么它只输出1,我应该如何解决它。提前致谢:D
答案 0 :(得分:1)
通过迭代更新可变变量的等价物是通过递归重新绑定不可变函数参数。因此,在伪代码中,不是“foo(){while(p){x ++;}}”,而是执行“foo(p,x){if(p){foo(p,x + 1);}} ”。或者在SML中,
type date = {year : int, month : int, day : int}
fun countMonth month (dates : date list) =
let fun countMonth' [] count = count
| countMonth' (d::ds) count =
if #month d = month
then countMonth' ds (count+1)
else countMonth' ds count
in countMonth' dates 0 end
但这是我如何使用高阶函数编写一个过滤列表中属于给定月份的日期数的函数:
type date = {year : int, month : int, day : int}
fun filterMonth month (dates : date list) =
List.filter (fn d => #month d = month) dates
fun countMonth month dates =
List.length (filterMonth month dates)