Re[2]: Как определить принадлежность генерику?
От: dsorokin Россия  
Дата: 20.04.10 05:42
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Лучше опиши задачу более детально.


Наверное, забыл упомянуть, что A — параметр типа. Поэтому int должен соответствовать. Но я так понял, что int- означает, что здесь может вывестись int, а может и нет. Никаких гарантий еще нет. Как сложатся звезды. Поэтому int- не будет ни TryRequire, не TryUnify для A. (я правильно понимаю?)

Первоначально мне нужно было хотя бы гипотетическое соответствие. То есть, может ли выражение иметь такой-то тип. В общем, взял код FixedType.Unify и просто переписал под себя. Работает. Но теперь я понял, что и это мне не нужно.

Я все пекусь о тех самых вычислительных выражениях. Еще раз перечитал спеки F# и понял, что "монадность" выражения можно целиком определить по синтаксическому разбору без привлечения вывода типов и без Typer.DelayMacro. Эта монадность возникает только в выражениях let!, do! и use! Все. Если какое-то выражение вне этого шаблона будет действительно иметь монадический тип, то оно будет вычислено, а затем просто проигнорировано, о чем будет выдан соответствующий warning компилятора. Вот, зачем нужен do!. Короче говоря, все можно решить гораздо проще. Но над этим стоит еще подумать.

Кстати, мне не удалось ввести синтаксическую конструкцию def!. Когда делаю так

  public macro @bind (_expr)
  syntax ("def", "!", _expr) { <[ () ]> }


то компилятор уже в другой сборке начинает ругаться при разборе обычных def. Он начинает ожидать "!". Сейчас думаю использовать такие ключевые слова с добавкой comp: defcomp, usingcomp, docomp, returncomp и yieldcomp. Но с восклицательным знаком выглядело бы идиоматичнее и красивее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.