簡體   English   中英

F#基本問題:可變性,大寫標准,功能與方法

[英]Basic F# questions: mutability, capitalization standards, functions vs. methods

如果已經提出其他答案,請隨時向我指出!

我將從本月的新版本開始使用F#。 我有一些面向對象和功能語言(Haskell和Scheme,但沒有OCaml / ML)的背景。 到目前為止,還沒有閱讀完F#CTP附帶的一些教程小知識,就產生了兩個問題。

1)可變變量是否比monad優先? 如果是這樣,是否在F#中完全避免了Monad?

2)我對使用的大寫字母感到困惑。 在本教程的代碼文件中,函數有時以小寫字母開頭,有時以大寫字母開頭。 我知道MS傾向於喜歡帶有函數和方法的初始大寫字母,但在這里似乎有兩種實現方法。 對我來說,這並不是什么大不了的事情,因為我只是在玩自己的時間,但我很好奇標准是什么。

3)我對OO和功能樣式的整個組合感到很困惑。 print_string "string"很有意義,但是這里是List.map fn list (除非List只是名稱空間,請原諒我)。 然后是str.Length 任何人都想弄清楚什么時候使用什么,哪個是首選?

謝謝!

關於可變性:F#使您務實。 我很少喜歡使用monad而不是可變/引用,但是您可以做任何喜歡的事情。 Monad並沒有回避,但我認為人們傾向於僅在獲得明顯勝利(例如異步編程)時才使用它們。

關於命名:“功能就是價值”這一事實存在緊張關系,這意味着您可能選擇使用大寫字母(因為它是一個函數,並且功能以大寫字母開頭)來命名一個受約束的函數。 (因為這是一個約束值(類型名稱中恰好有一個'->'))。 就我個人而言,我更喜歡對所有函數始終使用大寫名稱,但是您會看到兩種樣式(特別是因為F#庫本身的樣式在過去一兩年中一直在緩慢發展/標准化)。 下划線似乎在整個.Net中都被避開了,F#庫不再是一個例外(有一些使用下划線的名稱,但是現在它們像拇指酸痛一樣脫穎而出,並且可能會改變)。

關於函數風格:我不清楚您要問什么。 對於List.map,“ List”是F# 模塊的名稱,而“ map”是該模塊中的函數。 成員函數(例如str.Length)具有在整個.Net中普遍使用的優勢,並在編輯器中提供了很好的智能體驗。

1)我不會拒絕說monads ...您提到過您對Haskell有一定的了解-所以F#工作流是您要研究的(工作流一詞可能令人困惑,但是這些僅是一點點與業務流程相關的東西)。 通常,序列表達式和更一般的計算表達式(又稱為工作流)將接近單子。 雖然我不確定“首選”是表達它的方式,但是說可變的是很普遍的。 他們每個人都有一個位置-就我個人而言,我從兩本書開始-'F#的基礎-但如果您想潛入-走'Expert F#'-兩者都是不錯的。 老實說,我需要基金會來幫助我入門。

2)根據我的經驗,困惑是.NET中的傳統函數有一個約定,實際上並不適合於函數式編程。 因此,我覺得在F#中,當您查看“傳統.NET”命名函數與明顯具有功能的F#元素的用法時,有時可能會感到困惑。例如,在我上面提到的書中“專家F#”-他們提到您會在camelCase和PascalCase中都看到let值,例如List.map和Dates.Today(Pascal情況是更傳統的.NET)。 一條好的經驗法則是,如果您停留在功能世界中,請使用更傳統的功能(camelCase)命名-但是,如果您所編寫的內容預計會被其他.NET語言使用,請使用更多.NET規范(帕斯卡)。 還要注意,在功能世界中,對縮寫詞(itr,tbl等...)的容忍度要高得多,因為.NET通常已經不再使用該詞法了...所以,您再次會看到這種程度的變化某種情況取決於您是在調用功能元素還是在整個整個.NET中共享的F#中公開的元素。

3)我同意OO和函數樣式的組合可能會造成混淆。 再說一次,我不確定哪一個更可取,除了說F#(具有功能性)顯然在功能范式方面明確說明了自己的風格。 但是,F#是.NET世界中的一種功能性語言(請注意,我上面提到的命名的相對混亂)……因此,這還不是很清楚。

希望這對您有所幫助。信不信由你,當您使用F#並想到其他具有與C共享C ++概念的語言時(例如),它會變得更加容易。 就個人而言,命名開始變得有意義,當我開始認識到我是F#時,這些概念就開始起作用了,它是一種在傳統平台上運行的功能語言-旨在實現互操作(盡管我不確定將互操作稱為無縫操作是否合適: D)

在一般的monad中(F#中的“工作流”)比在Haskell中少得多,首先,因為可變變量可用,所以人們不太可能選擇使用狀態monad。 其次,沒有更高類型的類型變量,這意味着您不能編寫在任何monad上都可以重載的代碼,這使得使用它們的吸引力大大降低。

它們通常使用的一個地方是序列表達式(這確實類似於Haskell中的列表推導,但是與列表單子關系密切)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM