gpt4 book ai didi

haskell - 如何在 Haskell 中处理大量仿函数?

转载 作者:行者123 更新时间:2023-12-04 15:50:29 24 4
gpt4 key购买 nike

时不时地我发现自己映射到一堆很深的仿函数,例如一些可选值集合的解析器:

-- 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对于内部仿函数;尽管这在实践中并不总是很好。

    我使用了本地命名绑定(bind)。但即使 doClassify留下了 f它有时有助于澄清正在发生的事情的高级 View :“关于我们正在做的事情的解析值,请参阅下面的事情做什么。”我不知道进行绑定(bind)的效率问题是什么。

    我还使用了 fmap 的具体实例对于 Map 实例。这有助于我在堆栈中定位并为最终 fmap 提供路标.

    希望这可以帮助。

    关于haskell - 如何在 Haskell 中处理大量仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51652842/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com