ConstraintKinds
例
code:hs
{-# LANGUAGE ConstraintKinds #-} -- 型制約のエイリアス
type MonMonad m a = (Monoid (m a), Monad m) -- :: Constraint
-- 型制約コンストラクタのエイリアス
type Mappable = Functor -- :: * -> Constraint
型制約変数は、型制約として扱えない
これはエラーになる
code:prelude.hs
:type undefined :: a => Proxy a
aを「任意の型制約」として=>の左辺に書いているつもりだが、
aは具体型*として認識されるので(?)、これはエラーになる
code:prelude.hs
:set -XConstraintKinds
:type undefined :: a => Proxy a
undefined :: a => Proxy a :: a => Proxy a
型制約種を持つものなら、型制約として扱えるようになる
便利ライブラリ
参考
「最後にConstraintKinds拡張をきちんと紹介しておきましょう」のところから