从我正在阅读的内容来看,它$
被描述为"将一个函数应用于它的参数".但是,它似乎不像(apply ...)
Lisp 那样工作,因为它是一个二元运算符,所以它看起来真的唯一有助于有时避免使用括号,foo $ bar quux
而不是foo (bar quux)
.我明白了吗?后一种形式被认为是"坏风格"吗?
$
当开放和关闭的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
.
你大部分时间都理解正确 - 也就是说,大约99%的$使用是为了避免括号,是的,在大多数情况下,它似乎优于括号.
但请注意:
> :t ($) ($) :: (a -> b) -> a -> b
也就是说,$是一个函数; 因此,它可以传递给函数,由它组成,以及你想用它做的任何其他事情.我想我之前看到它曾被人们用组合器搞砸了.