我嘗試瞭解如何使用數據類型族來隱藏構造函數。給出的微不足道的例子是一對具有從普通對轉換成普通對的操作等)。 bifunctor的實例不能編譯;該錯誤信息是類型族:如何爲一對數據類型族實例化Bifunctor?
src/TypeFamilyTest.hs:66:21
: 的Bifunctor
的第一個參數應該有一種* -> * -> *
, 但Pairs a b
有種ghc-prim-0.4.0.0:GHC.Prim.Constraint
在實例聲明
Bifunctor (Pairs a b)
試圖Bifunctor Pair where ...
我再弄錯誤消息列表相同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
Haskell'class'最接近OOP的概念是類似Java的'interface',即使這種對應也是鬆散的。 – chi