ConstraintKinds
型エイリアスと同じ構文で、型制約種のエイリアスを書くことができるGHC拡張
例
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は具体型*として認識されるので(?)、これはエラーになる
ここでConstraintKindsを使用することでそれがきでるようになる
code:prelude.hs
:set -XConstraintKinds
:type undefined :: a => Proxy a
undefined :: a => Proxy a :: a => Proxy a
型制約種を持つものなら、型制約として扱えるようになる
便利ライブラリ
https://hackage.haskell.org/package/constraints
参考
Haskellの種(kind)について (Part 2) - Haskell-jp
「最後にConstraintKinds拡張をきちんと紹介しておきましょう」のところから
https://zenn.dev/mod_poppo/books/haskell-type-level-programming/viewer/constraint-kinds