aha. ok, so i was substituting "$" rather than ":$" for the function, which i guess means it's resolved to be $(::Any, ::Any) before substitution. if i use the symbol :$ then things work correctly.
so this works fine: immutable Fast{U<:Unsigned} i::U end +{U<:Unsigned}(a::Fast{U}, b::Fast{U}) = Fast{U}(a.i $ b.i) immutable Slow{I<:Unsigned} i::I end for (name, op) in ((:+, :$),) @eval $name{U<:Unsigned}(a::Slow{U}, b::Slow{U}) = Slow{U}(($op)(a.i, b. i)) end