{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE TypeOperators #-}

module T12522a where

import Data.Kind (Type)

newtype I a = I a

type family Curry (as :: [Type]) b = f | f -> as b where
    Curry '[] b = I b
    Curry (a:as) b = a -> Curry as b

data Uncurried (as :: [Type]) b

def :: Curry as b -> Uncurried as b
def = undefined

-- test :: Uncurried [Int, String] String
test = def $ \n s -> I $ show n ++ s

