2014-02-07 2 views
1

Я немного новичок в F #, и я столкнулся с каким-то странным поведением, когда работал с некоторыми рекурсивными функциями. У меня есть две разные версии этого ниже:Рекурсивные аргументы функции # и переполнение стека

Версия 1:
Это вызывает переполнение стека, хотя и кажется, что он не должен (по крайней мере, на моих глазах нуб)

let rec iMake acc = 
    match acc with 
    | 10 -> 100 
    | _ -> iMake acc+1 

Version2:
Это работает так, как я ожидал.

let rec iMake acc = 
    match acc with 
    | 10 -> 100 
    | _ -> iMake (acc+1) 

Единственная разница в том, что версия 2 помещает выражение acc + 1 в скобки. Поэтому мой вопрос: почему первая версия не работает, а вторая? Означает ли это, что я должен поместить все аргументы моей функции в круглые скобки, чтобы избежать этого типа вещей в будущем?

ответ

3

Function call имеет более высокий приоритет, чем двоичный оператор +. Таким образом, первая функция на самом деле работает, как:

let rec iMake acc = 
    match acc with 
    | 10 -> 100 
    | _ -> (iMake acc)+1 
+2

Я вижу, поэтому он пытается прибавить к результату (Imake акк), и именно там StackOverflow откуда. acc фактически никогда не увеличивается, интересно. –

Смежные вопросы