2017-04-17 56 views
0

即时通讯功能编程的新功能,但我有专门针对Java的命令编程经验。我想问一个值如何迭代在smlnj我知道,在Java上,你可以使用varName + = anyNumber或varName = varName + 1.在smlnj我不知道如何做到这一点,我的var值不迭代在这里是一个我的代码示例。提前致谢。smlnj如何迭代一个值

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。

我的代码中的问题是它只是输出1,即使我输入的所有日期都等于我输入的月份。我只想知道为什么它只输出1,我应该如何解决它。在此先感谢:D

+0

你正在从可变价值的角度思考,这意味着你在考虑命令而不是在功能上。您当然可以将1加1,但您不能(通过使用SML的纯功能部分)导致值发生变异,从而变得比当前值多1。 –

+0

对不起,即时通讯函数式编程,我应该如何处理这个问题?你能给我一个例子或链接,我可以理解它:D谢谢:) –

回答

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)