Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每月练习中的数字(smlnj如何迭代值)_Sml_Smlnj - Fatal编程技术网

每月练习中的数字(smlnj如何迭代值)

每月练习中的数字(smlnj如何迭代值),sml,smlnj,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 l

我是函数式编程新手,但我有命令式编程的经验,特别是在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
该程序将检查输入的列表上的日期是否存在于输入的月份,并将输出该月份存在的日期数

例如:月份[年、月、日]中的数字 在[2017,2,12015,2,32012,1,2]的月数中,2输出必须为2,因为列表中的第一项和第二项等于月份


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

通过迭代更新可变变量的等效方法是通过递归重新绑定不可变函数参数。因此,在伪代码中,您不用foo{whilep{x++;}},而是执行foop,x{if p{foop,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)

你的思维方式是可变的,这意味着你的思维方式是强制性的,而不是功能性的。你当然可以给一个值加1,但是你不能通过使用SML的纯函数部分使一个值发生变化,从而比它的当前值多1。对不起,我是函数式编程的新手,我该如何处理这个问题?你能给我一个我能理解的例子或链接吗:D谢谢: