diff --git a/Mapping.cabal b/Mapping.cabal
--- a/Mapping.cabal
+++ b/Mapping.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                Mapping
-version:             0.1.0.1
+version:             1.0.0.0
 synopsis:            Mapping
 -- description:         
 homepage:            https://github.com/zaoqi/Mapping.hs
diff --git a/Mapping.hs b/Mapping.hs
--- a/Mapping.hs
+++ b/Mapping.hs
@@ -13,14 +13,16 @@
 --    You should have received a copy of the GNU Affero General Public License
 --    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 module Mapping(
-    Mapping(),
+    Mapping(MappingNil),
     mappingRef,
     mappingSet,
     mappingUnion,
     mappingMayRemove,
+    mappingRemove,
     mappingHas,
     mappingToList,
     listToMapping,
+    mappingAppendList,
     ) where
 
 type List a = [a]
@@ -60,10 +62,18 @@
 mappingMayRemove (MappingNode l mk v r) k =
     case compare k mk of
         LT -> MappingNode (mappingMayRemove l k) mk v r
-        EQ -> MappingNil
+        EQ -> mappingUnion (\k v1 v2 -> error "!") l r
         GT -> MappingNode l mk v (mappingMayRemove r k)
 mappingMayRemove MappingNil _ = MappingNil
 
+mappingRemove :: Ord k => Mapping k v -> k -> Maybe (Mapping k v)
+mappingRemove (MappingNode l mk v r) k =
+    case compare k mk of
+        LT -> fmap (\l -> MappingNode l mk v r) (mappingRemove l k)
+        EQ -> Just (mappingUnion (\k v1 v2 -> error "!") l r)
+        GT -> fmap (\r -> MappingNode l mk v r) (mappingRemove r k)
+mappingRemove MappingNil _ = Nothing
+
 mappingHas :: Ord k => Mapping k v -> k -> Bool
 mappingHas (MappingNode l mk v r) k =
     case compare k mk of
@@ -77,8 +87,10 @@
 mappingToList MappingNil = []
 
 listToMapping :: Ord k => List (k, v) -> Mapping k v
-listToMapping ((k, v) : xs) = mappingSet (listToMapping xs) k v
-listToMapping [] = MappingNil
+listToMapping xs = mappingAppendList MappingNil xs
+
+mappingAppendList :: Ord k => Mapping k v -> List (k, v) -> Mapping k v
+mappingAppendList m xs = foldl (\h (k, v) -> mappingSet h k v) m xs
 
 instance (Eq k, Eq v) => Eq (Mapping k v) where
     x == y = mappingToList x == mappingToList y
