我從F#開始,在理解語法方面取得了一些進展。但是,我仍然不清楚使用F#功能的最佳方法。在Python中,我來自哪裏,通常有一種「最好」(幾乎是標準的)做事方式。也許F#也是這樣,但我還沒有弄明白。所以我的問題是關於使用F#的最佳方式,而不是關於F#語法的技術問題。我應該編寫利用Intellisense的代碼嗎?
最近我看到Dr. Eric Meijer (C9 Lectures - Functional Programming Fundamentals Chapter 2 of 13)
的一段視頻,其中Meijer博士稱讚OOP的點符號,注意到它允許Intellisense顯示可用方法的列表。他感嘆,這種設備在純FP中不可用,這使得程序員「前進」,從而使編程變得更加容易。
一些實驗表明,Intellisense當然可以使用F#類,但也可以與F#記錄一起使用,而F#記錄就像類一樣使用點符號。這意味着人們可以塑造自己的代碼,以便利用Intellisense而不用一路寫下類(我假設在F#類中比記錄更重且更慢,如果我錯了,請糾正我)。
下面的代碼演示了編寫代碼兩種方式(稱他們爲「版本」)執行相同的操作:
// Create a record type with two values that are functions of two arguments
type AddSub = {add2: int -> int -> int; sub2: int -> int -> int}
// Instantiate a record
let addsub a =
{add2 = (fun x y -> a + x + y); sub2 = (fun x y -> a - x - y)}
// Returns 7, Intellisense works on (addsub 0).
(addsub 0).add2 3 4
// Returns 3, Intellisense works on (addsub 10).
(addsub 10).sub2 3 4
// Create two functions of three arguments
let add3 a x y = a + x + y
let sub3 a x y = a - x - y
// Also got 7, no Intellisense facility here
add3 0 3 4
// Also got 3, no Intellisense facility here
sub3 10 3 4
這表明,有純FP和OOP之間的中間策略:創建記錄類型具有函數值,如上所述。這樣的策略將我的代碼組織成以對象(記錄實例)爲中心的有意義的單元,並允許我使用Intellisense,但缺乏類提供的某些功能,如繼承和子類多態(如果我在此錯誤,請再糾正一次)。
來自OOP背景我覺得如果上面代碼中的a
這樣的對象在某種程度上比參數x和y更「顯着」(我將使該術語未定義),那麼這樣的編碼策略是合理的,兩者都是合理的基於代碼組織和使用Intellisense的能力。另一方面,面對面向對象的複雜性,我寧願留在「純粹的」FP領域。
是否使用兩種極端替代方法(OOP和純FP)之間的有價值的折衷?
一般來說,給定三種備選方案(純FP,上述記錄或類別),關於一種替代方案優於其他方案的情況的一般準則是什麼?
最後,有沒有其他編碼策略可以幫助我組織代碼和/或利用Intellisense?
太棒了!謝謝。我應該想到模塊。我猜Meijer博士抱怨說無法使用Intellisense,結果讓我失望了。但他在談論Haskell,也許在Haskell中沒有模塊或類似的設施。 – Soldalma
是的,Haskell的標準做法是從模塊中導入函數,而不是使用它們,因此這不是對Intellisense友好的。 – Tarmil
@Tarmil afaik,現在有用於Haskell的自動完成工具https://github.com/rikvdkleij/intellij-haskell – Yawar