smlnj如何迭代一个值

时间:2017-04-17 13:07:08

标签: sml smlnj

我是函数式编程的新手,但我有专门针对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

1 个答案:

答案 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)