Haskell适用和错误?

时间:2010-03-20 06:02:00

标签: haskell applicative

为什么我可以执行以下操作:

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以便它能按我的意图工作?

1 个答案:

答案 0 :(得分:3)

<$>仅要求ErrorT String Get成为Functor的实例。 <*>要求它是Applicative的实例。我认为这个实例声明应该有效:

{-# LANGUAGE FlexibleInstances #-}

instance (Error e, Monad m) => Applicative (ErrorT e m) where
    pure = return
    (<*>) = ap