代码之家  ›  专栏  ›  技术社区  ›  J Cooper

我什么时候应该使用$(并且可以用括号替换它)?

  •  9
  • J Cooper  · 技术社区  · 16 年前

    从我读到的, $ 被描述为“将一个函数应用于它的参数”。但是,它的工作方式似乎不太像 (apply ...) 在Lisp中,因为它是一个二元运算符,所以实际上它唯一能做的就是避免使用括号,比如 foo $ bar quux 而不是 foo (bar quux) . 我理解对吗?后一种形式是否被认为是“糟糕的风格”?

    5 回复  |  直到 16 年前
        1
  •  18
  •   Apocalisp    16 年前

    $ 如果开始和结束parens之间的距离超过良好的可读性保证,或者如果您有几个嵌套的括号层,则首选括号。

    例如

    i (h (g (f x)))
    

    可以重写

    i $ h $ g $ f x
    

    换句话说,它表示右关联函数应用程序。这很有用,因为普通函数应用程序与左侧关联,即

    i h g f x
    

    …可以改写如下

    (((i h) g) f) x
    

    其他方便使用的 ($) 函数包括用它压缩列表:

    zipWith ($) fs xs
    

    这将应用函数列表中的每个函数 fs 到列表中相应的参数 xs ,并将结果收集到列表中。对比 sequence fs x 应用功能列表 FS 只有一个论点 x 并收集结果;以及 fs <*> xs 应用列表中的每个函数 FS 到列表中的每个元素 XS .

        2
  •  6
  •   Steven Dee    16 年前

    你基本上理解得对——也就是说,大约99%的美元是用来帮助避免括号,是的,在大多数情况下,它看起来确实比括号更合适。

    但是,请注意:

    > :t ($)
    ($) :: (a -> b) -> a -> b
    

    也就是说,$是一个函数;因此,它可以传递给函数、由函数组成,以及您想用它做的任何其他事情。我想我以前见过人们用它来拧组合器。

        3
  •  4
  •   Bas van Dijk    16 年前

    ($)的文档回答了您的问题。不幸的是,它没有列在 automatically generated documentation of the Prelude .

    但是,它列在您可以在此处找到的源代码中:

    http://darcs.haskell.org/packages/base/Prelude.hs

    但是,此模块不直接定义($)。前者进口的以下产品:

    http://darcs.haskell.org/packages/base/GHC/Base.lhs

    我包括以下相关代码:

    infixr 0  $
    
    ...
    
    -- | Application operator.  This operator is redundant, since ordinary
    -- application @(f x)@ means the same as @(f '$' x)@. However, '$' has
    -- low, right-associative binding precedence, so it sometimes allows
    -- parentheses to be omitted; for example:
    --
    -- >     f $ g $ h x  =  f (g (h x))
    --
    -- It is also useful in higher-order situations, such as @'map' ('$' 0) xs@,
    -- or @'Data.List.zipWith' ('$') fs xs@.
    {-# INLINE ($) #-}
    ($)                     :: (a -> b) -> a -> b
    f $ x                   =  f x
    
        4
  •  4
  •   Norman Ramsey    16 年前

    上面有很多好答案,但有一个遗漏:

    $ 不能总是用括号替换

    但是 任何应用 $ 可以用括号消除 以及 ($) 可替换为 id ,因为 $ 是标识函数的专门化 . 用途 (f$) 可替换为 f 但是像这样的用法 ($x) (以函数为参数并将其应用于 x )我看没有明显的替代品。

        5
  •  1
  •   Community basarat    7 年前

    如果我看看你的问题和答案,Apocalisp和你都是对的:

    • $ 首选括号 在某些情况下 (看他的回答)
    • foo (bar quux) 当然是不错的风格!

    另外,请结账 difference between . (dot) and $ (dollar sign) ,另一个与你的问题非常相关的问题。