。与$ in haskell相比

时间:2011-02-02 16:11:27

标签: haskell

  

可能重复:
  Haskell: difference between . (dot) and $ (dollar sign)

好的,我理解这一点:

f(g(x))

可以改写:

f $ g(x)

也可以改写:

f . g(x)

我不完全掌握的是两者在功能上不重叠的地方。我从概念上理解他们并没有完全重叠,但是有人可以一劳永逸地为我澄清这个吗?

3 个答案:

答案 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 $ xf . 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”是一个值而不是一个函数。