为什么我可以执行以下操作:
import Data.Word
import Data.Binary.Get
import Control.Applicative
import Control.Monad.Error
getW1 :: ErrorT String Get Word8
getW1 = lift getWord8
f1 = (+1) <$> getW1
但我不能这样做:
f2 = (+) <$> getW1 <*> getW1
以及如何修改f2以便它能按我的意图工作?
答案 0 :(得分:3)
<$>
仅要求ErrorT String Get
成为Functor
的实例。 <*>
要求它是Applicative
的实例。我认为这个实例声明应该有效:
{-# LANGUAGE FlexibleInstances #-}
instance (Error e, Monad m) => Applicative (ErrorT e m) where
pure = return
(<*>) = ap