OK. Как будет доступ.
D>>Иногда yieldcomp — очень полезная штука. Как и returncomp (aka return! в F#). С точки зрения монады yieldcomp и returncomp очень близки. WH>А вот тут ИМХО можно смотреть на типы.
Думаю, что можно и без этого. Даже хотелось бы, чтобы сохранить для пользователя возможность переопределять генерацию кода. По идее должен быть тип монады. В случае (1) enumerable comprehension это проверяется. В случае (2) общего билдера все определяется типом задаваемых методов YieldComp и ReturnComp. Если же кастомный билдер сам генерит код (3), то все будет так, как ему вздумается. В случае (4) list и array comprehension на типы забивается. Считается, что идет работа непосредственно с кодом, который меняет аккумулятор. Поэтому как бы тип монады вытекает сам собой. Значение в монаде — это сам код PExpr для list и array comprehension.
Тут выходит интересная вещь с конструкцией for для монадического выражения. Может быть еще немонадический for — там просто тупо подставляется сам for. В общем случае монадический for будет преобразован в foreach. Придется искусственно создавать объект типа IEnumerable[_]. Знаю как это можно сделать через ленивый поток (stream). На стек возвратов это не будет влиять.
В общем, получается довольно интересная вещь, которая до фига рутины автоматизирует. Особенно в случае enumerable comprehension. Я посмотрел рефлектором — там столько лямбд и замыканий создается...