diff --git a/Control/Applicative/QQ/Idiom.hs b/Control/Applicative/QQ/Idiom.hs
--- a/Control/Applicative/QQ/Idiom.hs
+++ b/Control/Applicative/QQ/Idiom.hs
@@ -4,7 +4,8 @@
 
 module Control.Applicative.QQ.Idiom (i) where
 
-import Control.Applicative
+import Control.Applicative ((<*>), pure)
+import Control.Monad ((<=<))
 import Language.Haskell.Meta (parseExp)
 import Language.Haskell.TH.Lib
 import Language.Haskell.TH.Quote
@@ -13,18 +14,12 @@
 -- ghci> [$i| (,) "foo" "bar" |]
 -- [('f','b'),('f','a'),('f','r'),('o','b'),('o','a'),('o','r'),('o','b'),('o','a'),('o','r')]
 i :: QuasiQuoter
-i = QuasiQuoter { quoteExp = applicateQ }
-
-applicateQ :: String -> ExpQ
-applicateQ s = case either fail unwindE (parseExp s) of
-                  x:y:xs -> foldl
-                              (\e e' -> [|$e <*> $e'|])
-                              [|$(return x) <$> $(return y)|]
-                              (fmap return xs)
-                  _ -> fail "applicateQ fails."
+i = QuasiQuoter { quoteExp = applicate <=< either fail return . parseExp }
 
-unwindE :: Exp -> [Exp]
-unwindE = go []
-  where go acc (e `AppE` e') = go (e':acc) e
-        go acc e = e:acc
+applicate :: Exp -> ExpQ
+applicate (AppE f x) =
+  [| $(applicate f) <*> $(return x) |]
+applicate (InfixE (Just left) op (Just right)) =
+  [| pure $(return op) <*> $(return left) <*> $(return right) |]
+applicate x = [| pure $(return x) |]
 
diff --git a/applicative-quoters.cabal b/applicative-quoters.cabal
--- a/applicative-quoters.cabal
+++ b/applicative-quoters.cabal
@@ -1,7 +1,7 @@
 Cabal-Version: >= 1.6
 
 Name:     applicative-quoters
-Version:  0.1.0.2
+Version:  0.1.0.3
 Category: Language
 Synopsis: Quasiquoters for idiom brackets and an applicative do-notation
 
@@ -26,7 +26,7 @@
 
   Build-depends:
       base >= 4 && < 4.5,
-      haskell-src-meta >= 0.2 && < 0.5,
+      haskell-src-meta >= 0.2 && < 0.6,
       template-haskell >= 2.4 && < 2.7
 
   -- We disable the missing-fields warning because not only do quoteType
