Я хочу создать DSL, где функции 2 (foo
и bar
) могут быть вызваны последовательно, так что
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
В С# я могу перегрузить bar
, чтобы принять BarResult или FooResult, но это не работает для F #. По крайней мере, не легко.
Я также попытался создать несколько Дискриминационных Союзов, но я действительно не могу обойти его.