有什么区别。 (点)和$(美元符号)?
点(.)
和美元符号($)
之间的区别是什么? 据我了解,它们都是不需要使用括号的语法糖。
$
运算符用于避免括号。 之后出现的任何内容都将优先于之前的任何内容。
例如,假设您有一行内容如下:
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 $ gx
变成f (gx)
。
(.)
用途往往稍微难以取代; 他们通常需要一个lambda或引入一个明确的函数参数。 例如:
f = g . h
变
f x = (g . h) x
变
f x = g (h x)
希望这可以帮助!
链接地址: http://www.djcxy.com/p/33161.html上一篇: What is the difference between . (dot) and $ (dollar sign)?