为了账号安全,请及时绑定邮箱和手机立即绑定

有什么区别。(点)和$(美元符号)?

有什么区别。(点)和$(美元符号)?

有什么区别。(点)和$(美元符号)?点之间的区别是什么?(.)美元符号($)?。据我所知,它们都是不需要使用括号的语法糖。
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

这个$运算符用于避免括号。在它之后出现的任何东西都将优先于任何之前出现的东西。

例如,假设您有一行内容如下:

putStrLn (show (1 + 1))

如果您想去掉这些括号,下面的任何一行也会执行相同的操作:

putStrLn (show $ 1 + 1)putStrLn $ show (1 + 1)putStrLn $ show $ 1 + 1

的主要目的.运算符不是为了避免括号,而是为了链式函数。它允许您将显示在右侧的任何内容的输出与显示在左侧的任何内容的输入相关联。这通常也导致较少的括号,但工作方式不同。

回到同一个例子:

putStrLn (show (1 + 1))
  1. (1 + 1)

    没有输入,因此不能与

    .

    接线员。
  2. show

    可以

    Int

    并返回一个

    String.

  3. putStrLn

    可以

    String

    并返回一个

    IO ().

你可以锁链showputStrLn就像这样:

(putStrLn . show) (1 + 1)

如果你喜欢的括号太多了,用$操作员:

putStrLn . show $ 1 + 1


查看完整回答
反对 回复 2019-06-24
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

它们有不同的类型和不同的定义:

infixr 9 .(.) :: (b -> c) -> (a -> b) -> (a -> c)(f . g) x = f (g x)infixr 0 $($) :: (a -> b) -> a -> b
f $ x = f x

($)用于替换正常的函数应用程序,但以不同的优先级来帮助避免括号。(.)是将两个函数组合在一起,形成一个新函数。

在某些情况下,它们是可互换的,但这在一般情况下是不正确的。典型的例子是:

f $ g $ h $ x

==>

f . g . h $ x

换句话说,在一连串的$S,除了最后一个,所有的都可以用.


查看完整回答
反对 回复 2019-06-24
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

还请注意($)专攻函数类型的标识函数..标识函数如下所示:

id :: a -> a
id x = x

($)看起来是这样的:

($) :: (a -> b) -> (a -> b)($) = id

注意,我有意在类型签名中添加了额外的括号。

使用($)通常可以通过添加括号来消除(除非在节中使用运算符)。例如:f $ g xf (g x).

使用(.)通常较难替换;它们通常需要lambda或引入显式函数参数。例如:

f = g . h

f x = (g . h) x

f x = g (h x)

希望这能帮上忙!


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 629 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信