[英]Proper style of do binding in F#
F#中'do'關鍵字的一個更微妙的用途是能夠注釋返回單位(aka語句)的表達式。 例如,我經常在函數定義中這樣做,以明確返回類型是單位,並指示編譯器為我鍵入check this。 例如:
let restart agent = do agent.Post Restart
但是,我不確定F#社區對'do'關鍵字的主導作用是什么。
在此示例中使用'do'關鍵字的正確方法是什么:
// Annotate each statement
let move source destination =
do copy source destination
do clear source
// Annotate the statements as one block
let move source destination =
do
copy source destination
clear source
// Just annotate the "return" statement
let move source destination =
copy source destination
do clear source
// Perhaps don't annotate at all?
let move source destination =
copy source destination
clear source
我很少看到do
在F#代碼用於此目的(引入unit
表達式)。 您描述的大多數類型檢查已經在沒有它的情況下自動執行,以FS0020警告未使用值的形式。
如果你只是寫
let move source destination =
copy source destination
clear source
然后會發生三件事之一:
copy
和clear
返回unit
在這種情況下一切都很好。
copy
返回unit以外的類型
在這種情況下,您將收到有關忽略值的FS0020警告:
表達式
copy source destination
返回當前被忽略的int。 如果您不需要此值,則應使用ignore函數顯式忽略它,例如ignore (copy source destination)
或將結果綁定到名稱,例如let result = copy source destination
copy
返回單位, clear
返回unit
以外的類型
在這種情況下,沒有警告,但move
將具有與clear
相同的類型,並且此差異將在move
的呼叫站點處顯示,您將在此處獲得與上述相同的警告。
所以效用do
了類型檢查的目的是相當有限:僅在過去的情況下,它會有所作為,通過使警告出現在原來的線,而不是強迫你從導航到move
的呼叫中心(或潛在的-如果move
是其范圍中的最后一行 - 來自move
的調用者的調用站點,等等。 而這很少會擺在首位的錯誤-如果clear
回報值(例如一個布爾值,指示結算是否成功), 你肯定要傳播的信息執行調用鏈!
也就是說,這是一個非常簡單的標記,(IMO)絲毫不會損害可讀性,可以說是改進了它。 考慮到F#社區對少數喜歡禁用輕型語法( #light "off"
)並手動輸入分號和end
標記的用戶沒有問題,我無法想象do
任何地方do
引起任何挑剔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.