Вы не можете с тем, что у вас есть.
Для того, чтобы использовать useBar
с foo ~ Foo
, вам нужны доказательства того, что (forall x. SingI x => Barable (Foo x))
.
Сопоставление с образцом на proveBar
не будет работать, потому что к тому времени, когда вы совпадете с Dict
, x
больше не будет универсально квалифицированным;вы ограничили x
определенным (неуказанным) типом.
Что вам действительно нужно, так это соответствие шаблону типа Dict (forall x. SingI x => Barable (Foo x))
, но этот тип в настоящее время не поддерживается GHC:
• Illegal polymorphic type: forall x. SingI x => Barable (Foo x)
GHC doesn't yet support impredicative polymorphism
• In the type signature: proveBar' :: Dict (forall x. SingI x => Barable (Foo x))
Если бы вместо этого у вас было свидетельство формы
proveBar :: SingIBarable Foo
data SingIBarable foo where
SingIBarable :: (forall x. SingI x => Barable (foo x)) -> SingIBarable foo
Тогда вы сможете использовать useBar
при сопоставлении с шаблоном proveBar
.