# let y = z z ;;
val y : (('_a -> '_b) -> '_a -> '_b) -> '_a -> '_b = <fun>

Can anyone get rid of the pesky underscores in the type of y above, so
that it becomes truly polymorphic?

Eta expansion does it...

# let y x = z z x;;
val y : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>

Regards,
François