use unsafeCopy to support type abstractions with generic binder