. versus $ in haskell

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Haskell: difference between . (dot) and $ (dollar sign)

好吧,我明白这一点:

1
f(g(x))

可以重写:

1
f $ g(x)

也可以重写:

1
f . g(x)

我不完全理解的是这两者在功能上没有重叠。我从概念上理解,它们并没有完全重叠,但有人能为我一次性地澄清这一点吗?


1
2
3
4
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的组成"。


除了前面已经说过的,在这种情况下,您还需要$as"函数应用程序胶水":

1
2
map ($3) [(4+),(5-),(6*),(+4),(*5),(^6)]
--[7,2,18,7,15,729]

在这个例子中,(.3)(3)都不起作用。


"f$g x"不能重写为"f"。"X"。实际上,编译器甚至不会接受第二个函数,因为"(.)"的类型是"(B->C->(A->B->(A->C)"。也就是说,第二个参数必须是一个函数,"g x"是一个值,而不是一个函数。