我已分離出有問題的代碼,這個功能(使用ASP.NET的Membership類):的System.OutOfMemoryException一個尾遞歸函數
let dbctx = DBSchema.GetDataContext()
let rec h1 (is2_ : int) (ie2_ : int) : unit =
match is2_ >= ie2_ with
| true ->
let st2 = query {
for row in dbctx.Tbl_Students do
where (row.Id = is2_)
head}
let l2 =
Membership.FindUsersByEmail (st2.Email_address)
|> Seq.cast<_>
|> Seq.length
match l2 >= 1 with
| true ->
()
| false ->
Membership.CreateUser (st2.Email_address, password, st2.Email_address)
|> ignore
h1 (is2_ - 1) ie2_
| false ->
()
我得到一個確切後5626
System.OutOfMemoryException
迭代h1
。但是我的系統內存消耗只有在20 percent
。 (我有一個非常強大的16GB機器。)
爲什麼上面的函數應該溢出棧?它是不是遞歸地寫尾?
在此先感謝您的幫助。
你在Debug模式下運行嗎?如果是這樣,尾巴呼叫被禁用。在發佈模式下試用您的代碼。 – Daniel
我會用'Seq.isEmpty'重寫最後一部分。沒有必要列舉整個序列。 – pad
@丹尼爾是這樣嗎?我在項目中有許多其他的尾遞歸函數,它們在相同的調試模式下遍歷更大的深度而不會引發錯誤。不過,我會檢查是否是這個問題。感謝您的建議。 – Shredderroy