purescript-0.12.0: tests/purs/passing/NewtypeClass.purs
module Main where
import Prelude
import Effect
import Effect.Console
class Newtype t a | t -> a where
wrap :: a -> t
unwrap :: t -> a
instance newtypeMultiplicative :: Newtype (Multiplicative a) a where
wrap = Multiplicative
unwrap (Multiplicative a) = a
data Multiplicative a = Multiplicative a
instance semiringMultiplicative :: Semiring a => Semigroup (Multiplicative a) where
append (Multiplicative a) (Multiplicative b) = Multiplicative (a * b)
data Pair a = Pair a a
foldPair :: forall a s. Semigroup s => (a -> s) -> Pair a -> s
foldPair f (Pair a b) = f a <> f b
ala
:: forall f t a
. Functor f
=> Newtype t a
=> (a -> t)
-> ((a -> t) -> f t)
-> f a
ala _ f = map unwrap (f wrap)
test = ala Multiplicative foldPair
test1 = ala Multiplicative foldPair (Pair 2 3)
main = do
logShow (test (Pair 2 3))
log "Done"