我想創建一個DSL,其中2(foo
和bar
)功能可以連續叫,這樣如何創建交錯功能的類型安全的DSL電話
initialize()
|> foo 10
|> bar "A"
|> foo 20
|> bar "B"
|> transform
這個工程相當完美定義
type FooResult = FooResult
type BarResult = BarResult
let foo param (result_type:BarResult, result) = (FooResult, transform param result)
let bar param (result_type:FooResult, result) = (BarResult, transform param result)
但是現在我想還允許多個bar
電話可以連續執行。然而foo
仍然必須只有一次叫
initialize()
|> foo 10
|> bar "A"
//OK
|> bar "B"
|> transform
initialize()
|> foo 10
|> bar "A"
|> foo 20
//should yield an compile error
|> foo 30
|> bar "B"
|> transform
在C#中,我可以重載bar
來接受BarResult或FooResult,但不適用於F#。至少不容易。 我也試圖創建一些歧視聯盟,但我真的不能讓我的頭在附近。
哇!我必須承認我沒有考慮接口 - 但即使我做了,我當然也不會想出這樣的解決方案。你認爲歧視工會的解決方案也是可能的嗎? – robkuz
我不確定DU是否可以工作 - 這裏的關鍵技巧是使用接口之間的繼承關係(兩種不同類型兼容)。我想'inline'和重載可能是一種選擇。 –
還有一個問題。 'MarkedValue <#IBarInput,_>'中散列的含義是什麼? – robkuz