作者:长春搜房-杨志玲 | 来源:互联网 | 2022-12-08 19:28
偶尔我会发现自己映射到一大堆仿函数,例如一些可选值集合的解析器:
-- parse a rectangular block of characters to a map of
-- coordinate to the character, or Nothing for whitespace
parseRectangle :: Parser (Map (Int, Int) (Maybe Char))
data Class = Letter | Digit | Other
classify :: Char -> Class
parseClassifiedRectangle :: Parser (Map (Int, Int) (Maybe Class))
parseClassifiedRectangle = fmap (fmap (fmap classify)) parseRectangle
嵌套fmap
s有哪些好方法?通常它不像这里那么清楚,我最终添加fmap
s直到代码类型检查.简单的代码最终成为一堆fmap
样板,我真正想要表达的是"将此函数提升到适当的深度并将其应用于所包含的类型".
一些想法,到目前为止我都没有发现特别令人满意的想法:
定义fmap2 :: (Functor f, Functor g) => (a -> b) -> g (f a) -> g (f b)
和朋友
定义具体的帮手,比如 mapMaybeMap :: (a -> b) -> Map k (Maybe a) -> Map k (Maybe b)
newtype
为functor堆栈引入包装器,并创建那些实例Functor
,如newtype MaybeMapParser a = Parser (Map (Int, Int) (Maybe a))
其他人是否在大型代码库中遇到此问题?这甚至是个问题吗?你如何解决?