Вы используете не только тривиальную семантику конструкторов как навешивание бирок, но и рекурсию на типах, то есть неявно вызываете "комбинатор неподвижной точки на уровне типов". И после этого говорите, что никаких fix не было; читерство же!
Вы можете возразить, что в денотационной семантике ваше выражение нигде не использует fix (который переход к точной верхней грани последовательности всё более определённых выражений). Но это лишь потому, что вы отложили его до момента, когда надо будет вычислять применение функции к конкретному значению.
Впрочем, ведь и Data.Function.fix тоже откладывает этот момент, только он использует явную рекурсию через let (примитив языка), а Ваш вариант — явную рекурсию на типах (тоже встроенную в язык), но поскольку она делается в другой строчке, то якобы её не было :)
no subject
Date: 2012-10-14 02:54 pm (UTC)Вы можете возразить, что в денотационной семантике ваше выражение нигде не использует fix (который переход к точной верхней грани последовательности всё более определённых выражений). Но это лишь потому, что вы отложили его до момента, когда надо будет вычислять применение функции к конкретному значению.
Впрочем, ведь и Data.Function.fix тоже откладывает этот момент, только он использует явную рекурсию через let (примитив языка), а Ваш вариант — явную рекурсию на типах (тоже встроенную в язык), но поскольку она делается в другой строчке, то якобы её не было :)