まず、いくつかの典型的なタイプレベルの自然数のものから始めました。 {-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
data Nat = Z | S Nat
type family Plus (n :: Nat
これはa question I asked almost two years agoのフォローアップです。私はまだベクトル/行列/テンソルの次元が型システム(Peanoの番号付け)を使ってコード化されている小さな線形代数ライブラリを書く型システムを試しています。これにより、コンパイラはバイナリ演算を対応する次元のオブジェクトに制限することができます。 正常に動作しますが、手動で各寸法タイプを指定す
は、それは次のように型クラスを実装することが可能です: xと yは、このタイプのクラスの同じインスタンスの両方あるとき isEq x yがtrueを返す class SomeClass e where
isEq :: (SomeClass e') => e -> e' -> Bool
? コンテキスト:これは、実行時の型テストを取得する際に、薄く隠された試みです。最初は私はHaske
私の質問は、おそらく例の形で説明するのが最も簡単です: type family Take (n :: Nat) (xs :: [k]) :: [k]
type instance Take 0 xs = '[]
type instance Take (n+1) (x ': xs) = x ': Take n xs
(+)は、タイプファミリー自体されているため、ここで第二のインスタンスが、