Functor fmap,模式匹配函数值,haskell

Hon*_*omb 1 haskell function pattern-matching functor

我有以下类型,并希望使它成为一个Functor:

newtype SubsM a = SubsM {runSubsM :: Context -> Either Error (a, Env)}
Run Code Online (Sandbox Code Playgroud)

到目前为止我得到了这个

instance Functor SubsM where
    fmap f (SubsM a)  =  SubsM (\s->(Right((f a),(fst s))))
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,因为a不是预期的类型,我的问题是我如何在左侧模式匹配a?

Ben*_*son 7

当机器完全能够为你思考时,我宁愿不去想.

{-# LANGUAGE DeriveFunctor #-}

newtype SubsM a = SubsM {runSubsM :: Context -> Either Error (a, Env)}
    deriving Functor
Run Code Online (Sandbox Code Playgroud)


Dan*_*tin 5

请注意,您还可以使用现有的Functor情况下,为->Either做多的为你工作:

instance Functor SubsM where
  fmap g (SubsM cf) = SubsM (fmap (fmap (leftfmap g)) cf)
    where
      leftfmap f (a, b) = (f a, b)
Run Code Online (Sandbox Code Playgroud)

地图的Functor实例(,)超过了右边的值,而不是左边的,所以你不能fmap在那里使用.您也可以编写,leftfmap就像first从中导入该函数一样Control.Arrow.