diff --git a/Data/AList.hs b/Data/AList.hs
--- a/Data/AList.hs
+++ b/Data/AList.hs
@@ -1,19 +1,30 @@
 module Data.AList where 
+import Prelude hiding (sum)
 import Data.Monoid
 import Data.Semigroup
 
-data AList a = AListEmpty
-             | AList (AList a) (AList a)
+data AList a = AListTip a
+             | AListAppend (AList a) (AList a)
+             | AListEmpty
   deriving (Read,Show)
 
-append a@(AList _ _) b@(AList _ _) = AList a b 
-append AListEmpty a = a
-append a AListEmpty = a
+singleton x = AListTip x
+append = AListAppend 
 
-instance Monoid (AList a) where 
+fold f base (AListAppend a b) = f (fold f base a) (fold f base b)
+fold f base (AListTip x) = x
+fold f base AListEmpty = base
+
+sum = fold (+) 0
+
+drawAList x = '[' : drawAList' x ++ "]"
+drawAList' AListEmpty = ""
+drawAList' (AListAppend a b) = drawAList' a ++ "," ++ drawAList' b
+drawAList' (AListTip a) = show a 
+
+instance Monoid (AList a) where
  mempty = AListEmpty
  mappend = append
 
 instance Semigroup (AList a) where
  (<>) = append
-  
diff --git a/alist.cabal b/alist.cabal
--- a/alist.cabal
+++ b/alist.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.1.0.4
+version:             0.1.0.5
 
 -- A short (one-line) description of the package.
 synopsis:            lists with O(1) append
