| lit_ty == floatTy            = ConPat floatDataCon  lit_ty [] [] [LitPat (mk_float lit)  floatPrimTy]
   | lit_ty == doubleTy           = ConPat doubleDataCon lit_ty [] [] [LitPat (mk_double lit) doublePrimTy]
 
-               -- Convert literal patterns like "foo" to 'f':'o':'o':[]
+       -- Convert short string-literal patterns like "f" to 'f':[]
   | str_lit lit           = mk_list lit
 
   | otherwise = default_pat
     mk_double (HsFrac f)     = HsDoublePrim f
     mk_double l@(HsLitLit s) = l
 
-    null_str_lit (HsString s) = _NULL_ s
-    null_str_lit other_lit    = False
-
-    str_lit (HsString s)     = True
+    str_lit (HsString s)     = _LENGTH_ s <= 1 -- Short string literals only
     str_lit _                = False
 
     mk_list (HsString s)     = foldr
 
 % -----------------------------------------------------------------------------
-% $Id: PrelBase.lhs,v 1.36 2000/08/29 17:42:17 qrczak Exp $
+% $Id: PrelBase.lhs,v 1.37 2000/09/07 09:10:07 simonpj Exp $
 %
 % (c) The University of Glasgow, 1992-2000
 %
 %*********************************************************
 
 \begin{code}
-{-             
+{-
 data  Bool  =  False | True
 data Ordering = LT | EQ | GT 
 data Char = C# Char#
 type  String = [Char]
 data Int = I# Int#
 data  ()  =  ()
--- data [] a = MkNil
+data [] a = MkNil
 
 not True = False
 (&&) True True = True
 
     m >> k      =  m >>= \_ -> k
     fail s      = error s
-
 \end{code}
 
 
 ord (C# c) =  I# (ord# c)
 \end{code}
 
+String equality is used when desugaring pattern-matches against strings.
+It's worth making it fast, and providing a rule to use the fast version
+where possible.
+
+\begin{code}
+eqString :: String -> String -> Bool
+eqString []            []            = True
+eqString (C# c1 : cs1) (C# c2 : cs2) = c1 `eqChar#` c2 && cs1 `eqString` cs2
+eqString _            _             = False
+
+{-# RULES
+"eqString"  (==) = eqString
+  #-}  
+\end{code}
 
 %*********************************************************
 %*                                                     *
 --     unpackFoldr "foo" c (unpackFoldr "baz" c n)  =  unpackFoldr "foobaz" c n
 
   #-}
-
 \end{code}