可能重复:
Haskell: difference between . (dot) and $ (dollar sign)
好的,我理解这一点:
f(g(x))
可以改写:
f $ g(x)
也可以改写:
f . g(x)
我不完全掌握的是两者在功能上不重叠的地方。我从概念上理解他们并没有完全重叠,但是有人可以一劳永逸地为我澄清这个吗?
答案 0 :(得分:21)
Prelude> :t ($)
($) :: (a -> b) -> a -> b
Prelude> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
$
将函数应用于值。
.
组成了两个函数。
所以我可以写f $ g x
,即“将f应用于(g of x)”或f . g $ x
,即“将f和g的组合应用于x”。一种常见的风格是在左边堆积点,美元尾随。原因是f $ g $ x
与f . g $ x
的含义相同,但表达式f $ g
本身通常没有意义(事实上,可能是类型错误),而表达式f . g
表示“f和g的组成”
答案 1 :(得分:14)
除了已经说过的内容之外,在这种情况下你需要$ as“功能应用胶水”:
map ($3) [(4+),(5-),(6*),(+4),(*5),(^6)]
--[7,2,18,7,15,729]
(.3)
和(3)
都不适用于示例。
答案 2 :(得分:1)
“f $ g x”无法重写为“f.g g”。事实上,编译器甚至不会接受第二个函数,因为“(。)”的类型为“(b - > c) - >(a - > b) - >(a - > c )”。即第二个参数必须是函数,但“g x”是一个值而不是一个函数。