Type Families with Classショー:型クラスまたはタイプの家族を経由:タイプ 'Eq`に相当するタイプのファミリー?
私は不完全に理解したように、このスライドはEq
を実装する2つの方法を示しています。
私は型クラスに精通してるので、MyEq
を実装:
class MyEq a where
eq :: a -> a -> Bool
しかし、私はtype family
バージョンを定義しようとしたとき、それはコンパイルに失敗しました:
data Defined = Yes | No
type family IsEq (a :: *) :: Defined
起因する:
TypeEq.hs:30:30: error:
• Type constructor ‘Defined’ cannot be used here
(Perhaps you intended to use DataKinds)
• In the kind ‘Defined’
の実装方法を説明してくださいバージョンのEq
タイプのクラスです。 また、そのようなtype family
インスタンスの実装を表示すると便利です(正しい単語であれば)。
このおかげで、Alec! IsEq a〜Yesが何を意味するのか少し詳しくお聞かせください。また、 ':kind! IsEq [Int]は型レベル計算です。それは実際の値に 'IsEq'を適用することを意味しますか? '[1,2,3]'は意味がありませんか? –
@KevinMeredith「IsEq a〜Yes」は等価制約です.LHSとRHSが等しい場合にのみ保持されます。ここで、IsEq aとYesが等しい場合に保持するEq aという制約を定義します。また、 '[1,2,3]'のような実際の値に 'IsEq'を適用するのは意味がありません。' IsEq'は(値レベル)関数ではなく、タイプファミリ(制限された型レベル関数)です。 – Alec