Skip to content

Instantly share code, notes, and snippets.

@arkeet
Last active December 23, 2015 15:29
Show Gist options
  • Save arkeet/6656267 to your computer and use it in GitHub Desktop.
Save arkeet/6656267 to your computer and use it in GitHub Desktop.
Improved semigroups
import Data.Semigroup
data Improve a = Improve (a -> a) a
instance Semigroup (Improve a) where
~(Improve a' a) <> ~(Improve b' b) = Improve (a' . b') (a' b)
improve :: Semigroup a => a -> Improve a
improve a = Improve (a <>) a
disprove :: Improve a -> a
disprove ~(Improve _ a) = a
--
infixr 6 :<>
data M a = M a | M a :<> M a
deriving Show
instance Semigroup (M a) where
(<>) = (:<>)
m :: a -> Improve (M a)
m = improve . M
-- >>> disprove $ ((m 1 <> m 2) <> m 3)
-- M 1 :<> (M 2 :<> M 3)
--
-- >>> disprove $ fix ((m 1 <> m 2) <>)
-- M 1 :<> (M 2 :<> (M 1 :<> (M 2 :<> (...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment