データ型ファミリを使用してコンストラクタを隠す方法を理解しようとしています。与えられた簡単な例は、通常のペアなどから変換する操作を持つペアです。 bifunctorのインスタンスはコンパイルされません。エラーメッセージがタイプファミリー:ペアデータタイプファミリーのBifunctorをインスタンス化する方法は?
src/TypeFamilyTest.hs:66:21
です:Bifunctor
の最初の引数は一種* -> * -> *
、 を持っていますが、Bifunctor (Pairs a b)
、私は別の取得Bifunctor Pair where ...
をしようと
ためのインスタンス宣言では一種ghc-prim-0.4.0.0:GHC.Prim.Constraint
をPairs a b
ている必要がありますエラーメッセージには同じGHC.Prim.Constraint
が記載されています。インスタンスの正しい引数は何ですか?また、コンテキストはどのように渡されますか?
class Pairs a b where
data Vec2 a b
mkPair :: (a,b) -> Vec2 a b -- (FirstF a, SecondF a) -> a
splitPair :: Vec2 a b -> (a,b)
fstP :: Vec2 a b -> a
sndP :: Vec2 a b -> b
fstP = fst . splitPair
sndP = snd . splitPair
instance () => Bifunctor (Pairs a b) where
bimap opv oph vh = mkPair (opv . fstP $ vh, oph . sndP $ vh)
データファミリはコンストラクタを隠すことではありません。それらのコンストラクタは、通常のデータ型と同じ方法で表示または非表示にすることができます。データ・ファミリは、非パラメトリック・データ型(型引数を検査してそのコンストラクタの外観を決定する型)に関するものです。 –
タイプ・クラスはオブジェクト指向のクラスではありません。それはデータとその上で動作する操作をカプセル化しません。 – chepner
ハスケル 'クラス 'に最も近いOOPの概念は、Javaのような'インタフェース 'であり、この対応関係も緩いです。 – chi