blob: 66260ee8998fec134da2bf7adf5a2d974890b78a (
plain) (
tree)
|
|
{-# LANGUAGE Haskell2010 #-}
module Constructors where
data Foo
= Bar
| Baz
| Quux Foo Int
newtype Norf = Norf (Foo, [Foo], Foo)
bar, baz, quux :: Foo
bar = Bar
baz = Baz
quux = Quux quux 0
unfoo :: Foo -> Int
unfoo Bar = 0
unfoo Baz = 0
unfoo (Quux foo n) = 42 * n + unfoo foo
unnorf :: Norf -> [Foo]
unnorf (Norf (Bar, xs, Bar)) = xs
unnorf (Norf (Baz, xs, Baz)) = reverse xs
unnorf _ = undefined
unnorf' :: Norf -> Int
unnorf' x@(Norf (f1@(Quux _ n), _, f2@(Quux f3 _))) =
x' + n * unfoo f1 + aux f3
where
aux fx = unfoo f2 * unfoo fx * unfoo f3
x' = sum . map unfoo . unnorf $ x
|