2017-04-17 9 views
0

메신저 기능 프로그래밍에 새로운하지만 나는 특별히 자바에 대한 명령 프로그래밍 경험이 있습니다. 값을 smlnj에서 반복하는 방법을 물어보고 싶습니다. 당신은 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 ([(년, 월, 일), monthEntered) number_in_month ([(2017,2,1), (2015,2,3), (2012,1,2)], 2) 목록의 첫 번째 항목과 두 번째 항목이 monthEntered와 같기 때문에 결과는 2 여야합니다.

내 코드의 문제는 내가 입력 한 모든 날짜가 입력 한 달과 동일하더라도 그냥 출력 1입니다. 나는 왜 그것이 단지 1을 출력하고 어떻게 고쳐야 하는지를 알고 싶다. 미리 감사드립니다 : D

+0

당신에게 : 또는 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 

그러나 여기 내가 고차 함수를 사용하여 특정 달에 속하는 목록에서 날짜의 수를 필터링하는 기능을 써서 어떻게 당신이 기능적으로보다는 명령 적으로 생각하고 있음을 의미하는 가변적 인 가치의 관점에서 생각하고 있습니다. 물론 값에 1을 더할 수는 있지만 SML의 순수한 기능 부분을 사용하여 값을 현재 값보다 1이되도록 mutate 할 수는 없습니다. –

+0

실용적인 프로그래밍에 익숙하지 않아서이 문제를 어떻게 처리해야합니까? 나에게 그것을 이해할 수있는 예제 나 링크를 줄 수 있니? D Thanks :) –

답변

1

반복을 통해 변경 가능한 변수를 업데이트하는 것은 재귀를 통해 변경 불가능한 함수 매개 변수를 다시 바인딩하는 것과 같습니다. 의사 코드에서 "foo (p, x) {if (p) {foo (p, x + 1);}"대신 "foo() {while (p) {x ++;}} ".

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)