SML-функционално програмиране

Искам да напиша код в SML, който имитира този на C++ като

i=i+1;

or

i++

Накратко, искам да преброя колко пъти се изпълнява цикълът (рекурсия), когато изразът if е верен. Изяснявайки го допълнително. Моят проблемен код изглежда така:

val i = 0;
fun <function_name>() = 
   if <condition>
   then (i+1;
         <recursive_expression>)
  else expression

Но проблемът тук е, че отговорът винаги е 1, без значение колко пъти се извършва рекурсията поради неизменността в SML/NJ.

Всякакви идеи ще са от полза!


person progunner    schedule 07.10.2013    source източник
comment
Можете ли да публикувате целия си код?   -  person Lucas Ribeiro    schedule 08.10.2013


Отговори (2)


Тъй като не публикувахте целия си код, създадох прост тук:

fun evens(int_list: int list) =
    let fun evens_helper(int_list: int list, times: int) =
    if null int_list
    then times
        else if null (tl int_list)
    then 
        if (hd int_list) mod 2 = 0
        then 1
        else 0
    else if (hd int_list) mod 2 = 0
    then 1 + evens_helper(tl int_list, times + 1)
    else evens_helper(tl int_list, times)
    in evens_helper(int_list, 0)
    end

За да направите това, от което се нуждаете, най-простото нещо, което трябва да направите, е да създадете помощна функция във вашата функция, която прави точно същото като оригиналната функция, но взема един аргумент повече (вашият брояч). Ако вашият брояч трябва да е активиран, тогава извиквате рекурсивното повикване с брояч +1. Ако не искате да бъдете активирани, извикайте рекурсивната функция, като използвате същата стойност на брояча.

Ако все още не сте го получили, публикувайте целия си код, за да мога да го видя.

person Lucas Ribeiro    schedule 07.10.2013

Вашият if/then израз трябва да има подобен тип. Ето един бърз пример, който може да ви бъде полезен.

fun how_many_evens (from,to)=
    let fun count_even (m,count) =
    if m > to then count
        else
        if m mod 2 = 0 then count_even(m+1,count+1)
        else count_even(m+1,count)

    in
        count_even (from,0)
    end
person timmur    schedule 07.10.2013