F#計算表達式有語法:爲什麼F#計算表達式需要構建器對象(而不是類)?
ident { cexpr }
哪裏ident
是生成器對象(這句法從Don Syme's 2007 blog entry拍攝)。
在我見過的所有例子中,建設者對象是單實例,和無狀態啓動。唐給予稱爲attempt
定義生成器對象的例子:
let attempt = new AttemptBuilder()
我的問題:爲什麼不F#只需直接使用AttemptBuilder
類計算表達式?當然,該符號可以像實例方法調用一樣容易地去除靜態方法調用。
使用實例值意味着人們可以在理論上實例化可變的內部狀態相同類的多個製造商的對象,想必參數化在某種程度上,甚至(但願)。但我無法想象這將如何有用。
更新:我上面引述表明建造者必須顯示爲一個單一的標識符,這是一種誤導,可能反映了語言的早期版本的語法。最近F# 2.0 Language Specification定義語法爲:
expr { comp-or-range-expr }
這清楚地表明,任何式(計算結果爲生成器對象)可被用作構建體的第一個元素。
實施例:HTTPS: //github.com/mausch/fsharpx/blob/ec5f2de4c1c81aea8ef5e139b10c0cd0091ac2e5/src/FSharpx.Core/Monad.fs#L201 –