簡體   English   中英

適當的F#綁定風格

[英]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

然后會發生三件事之一:

  • copyclear返回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.

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