Да, у вас есть. Хотя ваш экземпляр для Keyed
выключен.
instance Keyed Pair where
mapWithKey f (Pair x y) = Pair (f False x) (f True y)
или даже проще
instance Keyed Pair where
mapWithKey = mapWithKeyRep
и аналогично
instance Distributive Pair where
distribute = distributeRep
Учитывая index
и tabulate
, вы можете использовать различные методы fooRep
в модуле Representable
, чтобы предоставить определения для всех других суперклассов.
Определения Extend
и Comonad
на самом деле не являются частью требований, которые должны быть Representable
. Они включены, тем не менее, потому что представимость означает, что вы изоморфны функции, которая позволяет вам переопределить определение для «экспоненциального» * 1020 * (он же cowriter, или Traced comonad), чтобы стать Comonad
также, учитывая некоторый моноид на вашем представлении. Это не требуется, хотя, главным образом потому, что я не могу ограничить его, учитывая используемые типы.
Возможно, вы захотите сбросить Semigroup
и Monoid
для Bool
, хотя и просто ручные инструменты extend
и extract
. Это достаточно просто.
instance Extend Pair where
extend f p@(Pair a b) = Pair (f p) (f (Pair b a))
instance Comonad Pair where
extract (Pair a b) = a
Кроме того, этот тип предоставляется пакетом представимые попытки , который включает в себя ряд других экземпляров.
И
import Control.Applicative
bool = [True, False]
f tt _tf _ft _ff True True = tt
f _tt tf _ft _ff True False = tf
f _tt _tf ft _ff False True = ft
f _tt _tf _ft ff False False = ff
associative f = and (assoc <$> bool <*> bool <*> bool) where
assoc a b c = f (f a b) c == f a (f b c)
semigroups = filter associative
[ f tt tf ft ff | tt <- bool, tf <- bool, ft <- bool, ff <- bool ]
unital (u, f) = all unit bool where
unit a = f u a == a && f a u == a
monoids = filter unital
[ (u, f) | u <- bool, f <- semigroups ]
показывает, что, как вы и предполагали, есть 4 возможных моноида, которые вы предполагали, и если вам нужен только экземпляр расширения, доступно 8 полугрупп.