Re[8]: Как определить принадлежность генерику?
От: dsorokin Россия  
Дата: 21.04.10 10:00
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Меняй.


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. Я посмотрел рефлектором — там столько лямбд и замыканий создается...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.