There is no real inconsistency, just that
Free type variables in the type signature are automatically added quantifiers forall, so the first case is really equivalent
foo :: forall callTree output input. ( callTree ~ SomeTypeFunc output
, OtherTypeFunc input ~ callTree
) => input -> output
type , , .
, , forall , , .
( OtherTypeFunc input ~ SomeTypeFunc output ) , , , .
, -, :
{-
type family OtherTypeFunc a
type family SomeTypeFunc a
type FooCtx input output value =
forall callTree. ( callTree ~ SomeTypeFunc output
, OtherTypeFunc input ~ callTree
) => value
-- This now works
foo' :: FooCtx input output ( input -> output )
foo' = undefined