{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeApplications #-}
import GHC.Exts (Constraint)
data Func (c :: (* -> * -> Constraint)) where
Func :: (forall a b. c a b => a -> b) -> Func c
class (c a, a ~ b) => BasicConstraint c a b
instance (c a, a ~ b) => BasicConstraint c a b
numFunc
= Func
@(BasicConstraint
Num)enumFunc
= Func
@(BasicConstraint
Enum)
class (c a, t a ~ b) => NewtypeConstraint c t a b
instance (c a, t a ~ b) => NewtypeConstraint c t a b
class EmptyConstraint a
instance EmptyConstraint a
maybeFunc
= Func
@(NewtypeConstraint EmptyConstraint
Maybe)
applyFunc :: Func c -> (forall a b. c a b => a -> b)
applyFunc (Func f) = f
pairmap :: (c a a', c b b') => Func c -> (a, b) -> (a', b')
pairmap f (x,y) = (applyFunc f x, applyFunc f y)
main = do
print $ pairmap
(maybeFunc Just
) ('a', True
)
ey0jIExBTkdVQUdFIEdBRFRzICMtfQp7LSMgTEFOR1VBR0UgRGF0YUtpbmRzICMtfQp7LSMgTEFOR1VBR0UgVHlwZU9wZXJhdG9ycyAjLX0Key0jIExBTkdVQUdFIEtpbmRTaWduYXR1cmVzICMtfQp7LSMgTEFOR1VBR0UgVHlwZUZhbWlsaWVzICMtfQp7LSMgTEFOR1VBR0UgUmFua05UeXBlcyAjLX0Key0jIExBTkdVQUdFIENvbnN0cmFpbnRLaW5kcyAjLX0Key0jIExBTkdVQUdFIE11bHRpUGFyYW1UeXBlQ2xhc3NlcyAjLX0Key0jIExBTkdVQUdFIEZsZXhpYmxlSW5zdGFuY2VzICMtfQp7LSMgTEFOR1VBR0UgVW5kZWNpZGFibGVTdXBlckNsYXNzZXMgIy19CnstIyBMQU5HVUFHRSBGbGV4aWJsZUNvbnRleHRzICMtfQp7LSMgTEFOR1VBR0UgVHlwZUFwcGxpY2F0aW9ucyAjLX0KCmltcG9ydCBHSEMuRXh0cyAoQ29uc3RyYWludCkKCmRhdGEgRnVuYyAoYyA6OiAoKiAtPiAqIC0+IENvbnN0cmFpbnQpKSB3aGVyZQogIEZ1bmMgOjogKGZvcmFsbCBhIGIuIGMgYSBiID0+IGEgLT4gYikgLT4gRnVuYyBjCgpjbGFzcyAoYyBhLCBhIH4gYikgPT4gQmFzaWNDb25zdHJhaW50IGMgYSBiCmluc3RhbmNlIChjIGEsIGEgfiBiKSA9PiBCYXNpY0NvbnN0cmFpbnQgYyBhIGIKCm51bUZ1bmMgPSBGdW5jIEAoQmFzaWNDb25zdHJhaW50IE51bSkKZW51bUZ1bmMgPSBGdW5jIEAoQmFzaWNDb25zdHJhaW50IEVudW0pCgpjbGFzcyAoYyBhLCB0IGEgfiBiKSA9PiBOZXd0eXBlQ29uc3RyYWludCBjIHQgYSBiCmluc3RhbmNlIChjIGEsIHQgYSB+IGIpID0+IE5ld3R5cGVDb25zdHJhaW50IGMgdCBhIGIKCmNsYXNzIEVtcHR5Q29uc3RyYWludCBhCmluc3RhbmNlIEVtcHR5Q29uc3RyYWludCBhCgptYXliZUZ1bmMgPSBGdW5jIEAoTmV3dHlwZUNvbnN0cmFpbnQgRW1wdHlDb25zdHJhaW50IE1heWJlKQoKYXBwbHlGdW5jIDo6IEZ1bmMgYyAtPiAoZm9yYWxsIGEgYi4gYyBhIGIgPT4gYSAtPiBiKQphcHBseUZ1bmMgKEZ1bmMgZikgPSBmCgpwYWlybWFwIDo6IChjIGEgYScsIGMgYiBiJykgPT4gRnVuYyBjIC0+IChhLCBiKSAtPiAoYScsIGInKQpwYWlybWFwIGYgKHgseSkgPSAoYXBwbHlGdW5jIGYgeCwgYXBwbHlGdW5jIGYgeSkKCm1haW4gPSBkbwogIHByaW50ICQgcGFpcm1hcCAobnVtRnVuYyAoKzIpKSAoMTo6SW50LCAyOjpGbG9hdCkKICBwcmludCAkIHBhaXJtYXAgKGVudW1GdW5jIHN1Y2MpICgxOjpJbnQsICdhJykKICBwcmludCAkIHBhaXJtYXAgKG1heWJlRnVuYyBKdXN0KSAoJ2EnLCBUcnVlKQo=