What is the purpose of the H type parameter here? You can just use
> takedecision(::Type{Dice}) = println("throw a dice")
> takedecision(Dice)
throw a dice
That would remove the objection of 'ugliness'.
immutable Dice end
> immutable Coin end
>
> takedecision{H <: Dice}(::Type{H})=println("throw a dice")
> takedecision{H <: Coin}(::Type{H})=println("flip a coin")
> makedecision(::Dice)=println("throw a dice")
> makedecision(::Coin)=println("flip a coin")
>
> takedecision(Dice)
> takedecision(Coin)
> makedecision(Dice())
> makedecision(Coin())
>