Собственно, не обязательно булевым (ох, нравится мне твоя терминология). Можно любым:
class Rigging r where
rpure :: r
rjoin :: r -> r -> r
data WithRigging r a = WithRigging r a
instance Functor (WithRigging r) where
fmap h (WithRigging r a) = WithRigging r (h a)
instance Rigging r => Applicative (WithRigging r) where
pure = WithRigging rpure
WithRigging r1 f <*> WithRigging r2 a = WithRigging (rjoin r1 r2) (f a)
Тогда Identity - это то, что rpure является левой единицей для rjoin, Homomorphism - это более узкое свойство rjoin rpure rpure = rpure, Composition - ассоциативность rjoin (при условии, что Identity выполняется), а Interchange - коммутативность.
no subject
Date: 2012-04-20 03:38 pm (UTC)Тогда Identity - это то, что rpure является левой единицей для rjoin, Homomorphism - это более узкое свойство rjoin rpure rpure = rpure, Composition - ассоциативность rjoin (при условии, что Identity выполняется), а Interchange - коммутативность.