к
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE GADTs #-}
data Ap f x = Ap (f x)
newtype I a = I a
newtype K a b = T a
1. вариант без типопеременных, тайпчекается
f :: Ap I Int ~ Ap (K Int) [Int, String] => ()
f = ()
2. вариант с типопеременной, но сразу же с ~ - тайпчекается
f :: forall (xs :: [*]). xs ~ [Int, String] => Ap I Int ~ Ap (K Int) xs => ()
3. вариант с типопеременной но без ~ - нет
f :: forall (xs :: [*]). Ap I Int ~ Ap (K Int) xs => ()
• Couldn't match kind ‘*’ with ‘[*]’
• In the ambiguity check for ‘f’