2016-08-20 72 views
4

在試圖將以下C#代碼轉換爲F#時,我正在努力使用'using'關鍵字。以下片段來自ILNumerics庫。如何翻譯以下內容?將C#'使用'關鍵字轉換爲F#

ILRetArray<double> ObjFuncBFGS2D(ILInArray<double> X) { 
    using (ILScope.Enter(X)) { 
     return X[0] * X[0] + X[1] * X[1] + 2; 
    } 
} 

在附註中,F#人傾向於使用哪些庫進行優化?我一直在使用NLoptNet,但在Matlab和Julia和Python中正確收斂的例程中存在着非常奇怪的收斂問題。因此,無論是我的F#翻譯問題(更可能的話)或優化庫。這是我希望能夠確定的。坦率地說,我對因特網上缺乏與F#相關的數值優化材料感到有些驚訝。

+0

F#有'using'(和'use') – Sehnsucht

+4

如果我沒有記錯,那麼'use/using'是你的問題中最少的。 ILNumerics利用了'ILArray','ILInArray'和'ILRetArray'之間的很多隱式轉換,這些轉換在C#中不會產生很多障礙,但需要在F#中進行顯式轉換。你可能需要定義一堆幫助函數來在這些函數之間進行轉換,以便完成任何事情。 – TheInnerLight

+0

@TheInnerLight任何建議都限制/不受限制的F#優化庫? –

回答

8

The MSDN documentation on resource management in F#與此處相關。要自動處置,在F#通常的方法是:

  • use,它取代let和部署一旦綁定超出範圍
  • using,處置,是以資源的功能完成和功能時在處置之前執行,其將一次性對象作爲輸入。

use的代碼可能是這樣的:

let ObjFuncBFGS2D (X : ILInArray<double>) = 
    use myEnteredScope = ILScope.Enter(X) 
    X.[0] * X.[0] + X.[1] * X.[1] + 2 

或者與using,像這樣:

let ObjFuncBFGS2D (X : ILInArray<double>) = 
    using (ILScope.Enter(X)) <| fun _ -> 
     X.[0] * X.[0] + X.[1] * X.[1] + 2 

我不使用ILNumerics,不能語法檢查這個,但我希望這個想法很明確。