@@ -56,6 +56,7 @@ module Data.Aeson.Types.Internal
5656import Control.Applicative
5757import Control.DeepSeq (NFData(..))
5858import Control.Monad (MonadPlus(..), ap)
59+import qualified Control.Monad.Fail as Fail
5960import Data.ByteString.Builder (Builder, char7, toLazyByteString)
6061import Data.Char (isLower, isUpper, toLower)
6162import Data.Data (Data)
@@ -122,35 +123,43 @@ instance Functor Result where
122123 {-# INLINE fmap #-}
123124
124125instance Monad IResult where
125− return = ISuccess
126+ return = pure
126127 {-# INLINE return #-}
127128
128129 ISuccess a >>= k = k a
129130 IError path err >>= _ = IError path err
130131 {-# INLINE (>>=) #-}
131132
133+ fail = Fail.fail
134+ {-# INLINE fail #-}
135+
136+instance Fail.MonadFail IResult where
132137 fail err = IError [] err
133138 {-# INLINE fail #-}
134139
135140instance Monad Result where
136− return = Success
141+ return = pure
137142 {-# INLINE return #-}
138143
139144 Success a >>= k = k a
140145 Error err >>= _ = Error err
141146 {-# INLINE (>>=) #-}
142147
148+ fail = Fail.fail
149+ {-# INLINE fail #-}
150+
151+instance Fail.MonadFail Result where
143152 fail err = Error err
144153 {-# INLINE fail #-}
145154
146155instance Applicative IResult where
147− pure = return
156+ pure = ISuccess
148157 {-# INLINE pure #-}
149158 (<*>) = ap
150159 {-# INLINE (<*>) #-}
151160
152161instance Applicative Result where
153− pure = return
162+ pure = Success
154163 {-# INLINE pure #-}
155164 (<*>) = ap
156165 {-# INLINE (<*>) #-}
@@ -239,8 +248,12 @@ instance Monad Parser where
239248 m >>= g = Parser $ \path kf ks -> let ks' a = runParser (g a) path kf ks
240249 in runParser m path kf ks'
241250 {-# INLINE (>>=) #-}
242− return a = Parser $ \_path _kf ks -> ks a
251+ return = pure
243252 {-# INLINE return #-}
253+ fail = Fail.fail
254+ {-# INLINE fail #-}
255+
256+instance Fail.MonadFail Parser where
244257 fail msg = Parser $ \path kf _ks -> kf (reverse path) msg
245258 {-# INLINE fail #-}
246259
@@ -250,7 +263,7 @@ instance Functor Parser where
250263 {-# INLINE fmap #-}
251264
252265instance Applicative Parser where
253− pure = return
266+ pure a = Parser $ \_path _kf ks -> ks a
254267 {-# INLINE pure #-}
255268 (<*>) = apP
256269 {-# INLINE (<*>) #-}