从学期级别开始为孩子们进行亲切的模式匹配
Kind pattern matching for kinds from term level
是否可以在术语级别的提升种类上使用模式匹配?
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
module CatLib.SO.SO_KProduct where
-- | Cartesian Product
data CartProd a b = MkCartProd a b
type family Proj1 (asd :: CartProd a b) where
Proj1 ('MkCartProd a b) = a
type family Proj2 (asd :: CartProd a b) where
Proj2 ('MkCartProd a b) = b
map :: forall k1 k2 (ax :: CartProd k1 k2) (m :: k1 -> k2 -> *). m (Proj1 ax) (Proj2 ax)
map = __
-- -- I would prefer...
mapPM :: forall k1 k2 ('MkCartProd a x :: CartProd k1 k2) (m :: k1 -> k2 -> *). m a x
mapPM = __
一种方法是使用类型相等约束:
mapPM :: forall k1 k2 (p :: CartProd k1 k2) (m :: k1 -> k2 -> *) a x.
(p ~ 'MkCartProd a x) => m a x
是否可以在术语级别的提升种类上使用模式匹配?
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
module CatLib.SO.SO_KProduct where
-- | Cartesian Product
data CartProd a b = MkCartProd a b
type family Proj1 (asd :: CartProd a b) where
Proj1 ('MkCartProd a b) = a
type family Proj2 (asd :: CartProd a b) where
Proj2 ('MkCartProd a b) = b
map :: forall k1 k2 (ax :: CartProd k1 k2) (m :: k1 -> k2 -> *). m (Proj1 ax) (Proj2 ax)
map = __
-- -- I would prefer...
mapPM :: forall k1 k2 ('MkCartProd a x :: CartProd k1 k2) (m :: k1 -> k2 -> *). m a x
mapPM = __
一种方法是使用类型相等约束:
mapPM :: forall k1 k2 (p :: CartProd k1 k2) (m :: k1 -> k2 -> *) a x.
(p ~ 'MkCartProd a x) => m a x