作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
时不时地我发现自己映射到一堆很深的仿函数,例如一些可选值集合的解析器:
-- 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
有什么好方法年代?通常它不像这里那么清楚,我最终添加了
fmap
s 直到代码类型检查。简单的代码最终变成一团
fmap
样板,我真正想表达的是“将此功能提升到适当的深度并将其应用于包含的类型”。
fmap2 :: (Functor f, Functor g) => (a -> b) -> g (f a) -> g (f b)
和 friend 们mapMaybeMap :: (a -> b) -> Map k (Maybe a) -> Map k (Maybe b)
newtype
仿函数堆栈的包装器,并制作 Functor
的那些实例,如 newtype MaybeMapParser a = Parser (Map (Int, Int) (Maybe a))
最佳答案
让我在这个人们似乎羞于回答的有趣问题上打破僵局。这个问题可能更多地归结为风格问题,因此缺乏答案。
我的方法如下:
parseClassifiedRectangle :: Parser (Map (Int, Int) (Maybe Class))
parseClassifiedRectangle = doClassify <$> parseRectangle
where
doClassify = Map.map (fmap classify)
<$>
对于顶层 Functor,并保存
fmap
对于内部仿函数;尽管这在实践中并不总是很好。
doClassify
留下了
f
它有时有助于澄清正在发生的事情的高级 View :“关于我们正在做的事情的解析值,请参阅下面的事情做什么。”我不知道进行绑定(bind)的效率问题是什么。
fmap
的具体实例对于 Map 实例。这有助于我在堆栈中定位并为最终
fmap
提供路标.
关于haskell - 如何在 Haskell 中处理大量仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51652842/
我是一名优秀的程序员,十分优秀!