【问题标题】:. versus $ in haskell [duplicate].与haskell中的$相比[重复]
【发布时间】:2011-06-20 02:17:11
【问题描述】:

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

好的,我明白了:

f(g(x))

可以改写:

f $ g(x)

也可以改写:

f . g(x)

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

【问题讨论】:

  • 看,你实际上不能像第二个例子那样写。试试看!
  • 另外,函数调用不需要(也不推荐)括号。综上所述,例子应该是f (g x)f $ g x(f . g) x

标签: haskell


【解决方案1】:
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 的组合” "

【讨论】:

  • f $ g 对于无数的fg(考虑(\f -> f 0) $ (\x -> x + 1))来说是完全可能的并且类型正确,它与f g 完全相同。否则,正确。
  • @delnan 我想不出在f $ g $ x 的上下文中单独和​​f $ g。但这可能是想象力的失败。
  • 如果f 接受并返回一个函数,这是可能的。示例:const (f :: a -> b) $ (g :: c -> d) :: a -> bconst (f :: a -> b) $ (g :: c -> d) $ (... :: a) :: b。当然,要找到一个有意义/真实世界的例子要困难得多,但是 w.r.t.类型系统没有什么特别之处。
  • 已编辑以考虑您的观点。谢谢。
【解决方案2】:

除了已经说过的内容之外,在这种情况下,您还需要将 $ 作为“功能应用胶水”:

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

(.3)(3) 在示例中都不起作用。

【讨论】:

  • +1 - 非常适合讨论
【解决方案3】:

“f $ g x”不能重写为“f . g x”。事实上,编译器甚至不会接受第二个函数,因为“(.)”的类型是“(b -> c) -> (a -> b) -> (a -> c)”。即第二个参数必须是一个函数,但“g x”是一个值而不是一个函数。

【讨论】:

  • g x 将是(咖喱)2-or-more-ary g 的函数,例如const 0.
  • @delnan:是的,但我认为 g 与他使用它的方式是一元的。
猜你喜欢
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2013-03-10
  • 1970-01-01
  • 2018-08-29
相关资源
最近更新 更多