代码之家  ›  专栏  ›  技术社区  ›  Robert Massaioli

Haskell函数组合(.)和函数应用($)习惯用法:正确使用

  •  120
  • Robert Massaioli  · 技术社区  · 14 年前

    我一直在看书 真实世界的Haskell ,我已经接近尾声,但风格的问题一直困扰着我 (.) ($)

    当您编写一个由其他函数组成的函数时,您可以这样编写:

    f = g . h
    

    但当你在这些函数的末尾加上一些东西时,我是这样写的:

    k = a $ b $ c $ value
    

    但这本书会这样写:

    k = a . b . c $ value
    

    (.) ($)

    有没有一个理由认为使用书籍的方式比全部使用要好得多 ($)

    7 回复  |  直到 7 年前
        1
  •  157
  •   nbro kai    7 年前

    我想我可以从权威那里回答这个问题。

    . $ . 因此,这本书使用了 f . g . h $ x 语法。

        2
  •  54
  •   C. A. McCann Ravikant Cherukuri    14 年前

    它们确实是等价的:请记住 $ 操作员基本上什么也不做。 f $ x f x . 目的 $ $ 使用括号进行分组而不是中缀优先,代码段如下所示:

    k = a (b (c (value)))
    

    k = (a . b . c) value
    

    . 版本超过 $

    虽然,有些人可能会想,使用中缀运算符而不是圆括号是否是出于某种潜意识的冲动,以避免任何可能的类似Lisp(只是开玩笑。。。我想是的。

        3
  •  41
  •   nbro kai    7 年前

    f . g $ x , f . g 是一个有意义的句法单位。

    f $ g $ x , f $ g 不是一个有意义的单位。一连串的 $ 可以说更为必要-- 第一 得到结果 g 属于 x 然后 f 为了它, 然后 foo 然后

    与此同时,一连串的 . 可以说更具声明性,在某种意义上更接近于以数据流为中心的视图——组成一系列函数,并最终将它们应用于某些东西。

        4
  •  19
  •   Community Ramakrishna.p    7 年前

    对我来说,我认为答案是(a)整洁 Don said ; (b)我发现当我编辑代码时,我的函数可能会以无点风格结束,然后我所要做的就是删除最后一个 $ 而不是回去改变一切。当然,这是一个小问题,但是很好。

        5
  •  13
  •   Travis Brown    14 年前

    关于这个问题有一个有趣的讨论 this haskell-cafe thread $ "just plain wrong" ,并选择 f . g . h $ x 结束 f $ g $ h $ x 是回避问题的一种方式。

        6
  •  3
  •   Zifre    14 年前

    你的方法看起来很奇怪 $ 是不必要的。

        7
  •  0
  •   dkasak    9 年前

    我意识到这是一个很老的问题,但我想还有一个原因没有提到。

    f . g . h ,将自动应用您传入的值。但是,如果你写 f $ g $ h ,它将不起作用。