На самом деле, есть один, немного смешно, способ приблизить это:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ScopedTypeVariables #-}
foo :: forall abbrv. (abbrv ~ (Some, Huge, Type, Sig))
=> abbrv -> abbrv
foo x = meh x (x, x)
where meh :: abbrv -> (abbrv, abbrv) -> abbrv
meh x y = {- ... -}
Я не могу рекомендовать позволяя два расширения языка только ради сокращающих типов в подписи, хотя, если вы уже используя их (или GADT вместо семейств типов), я полагаю, что это ничем не повредит.
Чувствительность в стороне, вы должны рассмотреть возможность реорганизации своих типов в таких случаях, как это предлагает ehird.
Я полагаю, это предполагает, что 'meh' не является полиморфным? –