2014-02-07 99 views
1

我對F#有點新,並且在處理一些遞歸函數時遇到了一些奇怪的行爲。我有兩個不同的版本它下面:F#遞歸函數參數和堆棧溢出

版本1:
這導致堆棧溢出,但它似乎不應該(至少我的小白的眼睛)

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

版本2:
這一個按我的預期工作。

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 acc)的結果添加一個,這就是stackoverflow的來源。 acc實際上從來沒有變得有趣,有趣。 –