【问题标题】:Haskell coding-style: map, fmap or <$>?Haskell 编码风格:map、fmap 还是 <$>?
【发布时间】:2010-08-20 08:55:11
【问题描述】:

是否有任何理由比其他符号更喜欢以下符号之一,或者这只是偏好问题?

map toLower "FOO"

fmap toLower "FOO"

toLower <$> "FOO"

顺便说一句:我意识到&lt;$&gt;`fmap` 相同。我是否正确地假设map 只是fmap 的一种不太通用的形式?

【问题讨论】:

    标签: haskell functional-programming coding-style


    【解决方案1】:

    正如您所说,mapfmap 的一种不太通用的形式。如果你知道你有一个列表,那么我会使用map,因为它使代码更清晰,如果你犯了错误,错误消息可能不会那么混乱。但在很大程度上,这是一个偏好问题。

    (&lt;$&gt;)fmap 相同。在 GHC 7.10 之前,Prelude 没有导出它,因此默认情况下不可用 - 但即使使用较旧的 GHC 版本,也很容易从 Data.FunctorControl.Applicative 导入,而如今这几乎是执行此操作的标准方法。

    【讨论】:

    • liftMfmap 相同,只是它在Monad 而不是Functor 上重载。
    • liftA 也一样,泛化为Applicative Functors
    • &lt;$&gt; 是最近版本的前奏导出的。
    【解决方案2】:

    我同意 Ganesh 的观点,map 对于列表更清晰。我使用&lt;$&gt; 而不是fmap,除非它被部分应用。所以我会使用fmap reverse 来声明一个反转某个函子的所有元素的函数,但是如果我有所有可用的参数(例如,如果我在do 块中写一行)我倾向于使用运算符形式:reverse &lt;$&gt; f x

    【讨论】:

    • 我经常在中缀符号中使用fmap,例如:reverse `fmap` x,因为fmap在Prelude中,所以我不必导入Control.Applicative。然后如果我需要部分申请,我最终会写:f = (reverse `fmap`)
    • 我发现使用简单明了的fmap函数(前缀)看起来更好,但也许这只是我……我确实使用&lt;$&gt;,而我也在使用&lt;*&gt;,不过。
    猜你喜欢
    • 2022-10-04
    • 2015-12-24
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2016-03-21
    相关资源
    最近更新 更多