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?
当机器完全能够为你思考时,我宁愿不去想.
{-# LANGUAGE DeriveFunctor #-}
newtype SubsM a = SubsM {runSubsM :: Context -> Either Error (a, Env)}
deriving Functor
Run Code Online (Sandbox Code Playgroud)
请注意,您还可以使用现有的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.