私はHaskellの型のファミリ機能と型レベル計算を研究しています。 PolyKinds
を使用して、タイプレベルでのパラメトリック多型を取得することは非常に簡単です表示されます。Haskellで "kindクラス"を作成する方法、またはタイプファミリを使用して型レベルでアドホック多型を作成する
{-# LANGUAGE DataKinds, TypeFamilies, KindSignatures, GADTs, TypeOperators, UndecidableInstances, PolyKinds, MultiParamTypeClasses, FlexibleInstances #-}
data NatK = Z | S NatK
data IntK = I NatK NatK
infix 6 +
type family (x :: NatK) + (y :: NatK) :: NatK where
Z + y = y
(S x) + y = S (x + y)
-- here's a parametrically polymorphic (==) at the type-level
-- it also deals specifically with the I type of kind IntK
infix 4 ==
type family (a :: k) == (b :: k) :: Bool where
(I a1 a2) == (I b1 b2) = (a1 + b2) == (a2 + b1)
a == a = True
a == b = False
私は:kind! Bool == Bool
または:kind! Int == Int
または:kind! Z == Z
と:kind! (I Z (S Z)) == (I (S Z) (S (S Z)))
のようなものを行うことができます。
しかし、type +
アドホック多型を作りたいと思います。それは私がそれを与えるインスタンスに制約されるように。ここの2つのインスタンスは、種類がNatK
、タイプがIntK
のタイプです。
私が最初にそれがパラメトリック多型作ってみました:
infix 6 :+
type family (x :: k) :+ (y :: k) :: k where
Z :+ y = y
(S x) :+ y = S (x :+ y)
(I x1 x2) :+ (I y1 y2) = I (x1 :+ y1) (x2 :+ y2)
私は:kind! (I (S Z) Z) :+ (I (S Z) Z)
を行うことができますので、これは、動作します。
でも、:kind! Bool :+ Bool
とすることもできます。これは意味をなさないが、シンプルな型のコンストラクタとして使用できる。私はそのような誤った型を許さない型ファミリを作成したい。
この時点で私は失われています。私はtype
パラメータでタイプクラスを試しました。しかし、それはうまくいかなかった。
class NumK (a :: k) (b :: k) where
type Add a b :: k
instance NumK (Z :: NatK) (b :: NatK) where
type Add Z b = b
instance NumK (S a :: NatK) (b :: NatK) where
type Add (S a) b = S (Add a b)
instance NumK (I a1 a2 :: IntK) (I b1 b2 :: IntK) where
type Add (I a1 a2) (I b1 b2) = I (Add a1 b1) (Add a2 b2)
:kind! Add Bool Bool
でも可能です。
これは、:+
またはAdd
を「kind class」に制限する必要があるConstraintKinds
拡張と関係しますか?
ありがとう:種類とタイプがまったく同じように扱われますので、GHC 8.0、
KProxy
からが不要になります!これはかなりクールですが、正確に動作させるものを広げることができますか?つまり、それはなぜ機能しますか?オープン+クローズドソリューション、KProxyソリューション、TypeInTypeソリューションの両方に対応します。 – CMCDragonkai
ああ、私はちょうどあなたの最初の解決策をテストしましたが、それでも ':kind! Bool Boolを追加して、 'Bool Boolを追加:: *'します。私はこれが受け入れられるのではなくタイプエラーになることを望んでいました! – CMCDragonkai
また、2番目の解決策では 'Bool Boolを追加する 'こともできます。これは型エラーとして表示されません。 – CMCDragonkai