2017-04-17 8 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([(年、月、日)]、monthEntered) number_in_month([(2017,2,1)、(2015,2,3)、(2012,1,2)]、 2)リストの最初と2番目の項目がmonthEnteredに等しいため、出力は2でなければなりません。

私のコードの問題は、入力した日付のすべてが入力した月と等しい場合でも、出力されるのはちょうど1です。なぜ私はそれがちょうど1を出力し、私はそれを修正する必要があります知ってほしいです。ありがとうございます:D

+0

あなたはあなたが機能的にではなく命令的に考えていることを意味する可変値の観点から考えています。もちろん値に1を加えることはできますが、(SMLの純粋な機能部分を使って)値を現在の値よりも1だけ大きくなるように変更することはできません。 –

+0

私は機能プログラミングに新しい、この問題にどのように対処すべきですか?あなたが私にそれを理解することができる例またはリンクを与えることができますか:Dありがとう:) –

答えて

1

反復で可変変数を更新するのと同じことは、再帰によって不変関数のパラメータを再バインドすることです。したがって、擬似コードでは、 "foo(p、x){if(p){foo(p、x + 1);}}を" foo(){while(p){x ++;}} "または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) 
関連する問題