В дополнение к тому, что написал Дарио, вы не можете переопределить обычную последовательность, чтобы вести себя как монадическая do!
(даже если вы решили не поддерживать немонадные операции в своих вычислениях).Проблема в том, что обычная последовательность не обрабатывается переводчиком каким-либо особым образом, поэтому нет точки перехвата, которую вы могли бы использовать.Ваш пример будет переведен так:
let m = state.Delay(fun () ->
hello "world"
hello "F#"
state.Zero())
Вызов hello
не включен ни в один вызов участника, который может быть переопределен.
В более ранней версии последовательности F # использовался для преобразования в вызовы Let
члена, например:
let m = state.Delay(fun () ->
state.Let(hello "world", fun _ ->
state.Let(hello "F#", fun _ ->
state.Zero())))
Так что было можно делать то, что вы хотели, но в текущей версии этого сделать нельзя (я полагаю, что одной из причин было то, что это добавляет слишком много переносов, что ухудшает производительность).