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

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

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



慕运维8079593
浏览 635回答 3
3回答

绝地无双

这个$运算符用于避免括号。在它之后出现的任何东西都将优先于任何之前出现的东西。例如,假设您有一行内容如下:putStrLn (show (1 + 1))如果您想去掉这些括号,下面的任何一行也会执行相同的操作:putStrLn (show $ 1 + 1)putStrLn $ show (1 + 1)putStrLn $ show $ 1 + 1的主要目的.运算符不是为了避免括号,而是为了链式函数。它允许您将显示在右侧的任何内容的输出与显示在左侧的任何内容的输入相关联。这通常也导致较少的括号,但工作方式不同。回到同一个例子:putStrLn (show (1 + 1))(1 + 1)没有输入,因此不能与.接线员。show可以Int并返回一个String.putStrLn可以String并返回一个IO ().你可以锁链show到putStrLn就像这样:(putStrLn . show) (1 + 1)如果你喜欢的括号太多了,用$操作员:putStrLn . show $ 1 + 1

胡子哥哥

它们有不同的类型和不同的定义: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,除了最后一个,所有的都可以用.

缥缈止盈

还请注意($)是专攻函数类型的标识函数..标识函数如下所示:id :: a -> a id x = x当($)看起来是这样的:($) :: (a -> b) -> (a -> b)($) = id注意,我有意在类型签名中添加了额外的括号。使用($)通常可以通过添加括号来消除(除非在节中使用运算符)。例如:f $ g x成f (g x).使用(.)通常较难替换;它们通常需要lambda或引入显式函数参数。例如:f = g . h成f x = (g . h) x成f x = g (h x)希望这能帮上忙!
打开App,查看更多内容
随时随地看视频慕课网APP