2017-04-17 7 views
0

ich bin neu in der funktionalen Programmierung, aber ich habe Erfahrung in der imperativen Programmierung speziell auf Java. Ich möchte fragen, wie ein Wert in Smln iterate ich weiß, dass auf Java können Sie varName + = anyNumber oder varName = varName + 1. auf smlnj ich weiß nicht, wie dies zu tun und mein Var-Wert ist nicht iterieren hier ist ein Beispiel meines Codes. Danke im Voraus.smlnj wie man einen Wert iteriert

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 

dieses Programm wird prüfen, ob die Daten (auf einer Liste) sind auf dem Monat eingetragen und wird ausgegeben, wie viele Daten im Monat geben.

zum Beispiel: number_in_month ([(Jahr, Monat, Tag)], monateEntered) number_in_month ([(2017,2,1), (2015,2,3), (2012,1,2)], 2) Ausgabe muss 2 sein, da das erste und zweite Element in der Liste gleich dem memberEntered ist.

Das Problem in meinem Code ist es nur Ausgabe 1, auch wenn alle Daten, die ich eingegeben habe, gleich dem Monat ist, den ich eingeben. ich will nur wissen, warum es nur 1 ausgibt und wie soll ich es beheben. Vielen Dank im Voraus: D

+0

Sie denken in veränderlichen Werten, dh Sie denken eher zwingend als funktional. Sie können natürlich 1 zu einem Wert hinzufügen, aber Sie können nicht (indem Sie die reinen funktionalen Teile von SML verwenden) veranlassen, dass ein Wert so mutiert wird, dass er 1 mehr als sein aktueller Wert wird. –

+0

Tut mir leid, ich bin neu in der funktionalen Programmierung, wie soll ich mit diesem Problem umgehen? kannst du mir ein Beispiel oder einen Link geben, wo ich es verstehen kann: D Danke :) –

Antwort

1

Ein Äquivalent zum Aktualisieren einer veränderbaren Variablen durch Iteration ist das erneute Binden eines unveränderlichen Funktionsparameters durch Rekursion. Also, statt "foo() {while (p) {x ++;}}", in Pseudo-Code, tun Sie "foo (p, x) {wenn (p) {foo (p, x + 1);}} ". Oder in 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 

Aber hier ist, wie ich eine Funktion schreiben würde, das die Anzahl von Daten in einer Liste Filter, die zu einem bestimmten Monat gehören eine Funktion höherer Ordnung mit:

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)