Если вы хотите, чтобы h
самостоятельно решил, какой экземпляр использовать, просто предоставьте аннотацию, чтобы устранить неоднозначность. Скажем, если вы хотите выбрать b ~ Int
h :: Foo a => a -> a
h = f . (g :: Int -> a)
(я думаю, Foo
понадобится еще один параметр b
в вашем реальном классе, но в таком случае этот подход может быть адаптирован по мере необходимости).
Если вместо этого вам нужен вызывающий из h
, чтобы выбрать экземпляр, а не h
, вы можете использовать AmbiguousTypes
и TypeApplications
(и ScopedTypeVariables
).
h :: forall b a . Foo a => a -> a
h = f . (g :: b -> a)
Позже вы можете позвонить h
, например, h @ Int
, чтобы выбрать b ~ Int
.