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