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

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


$运算符用于避免括号。 之后出现的任何内容都将优先于之前的任何内容。

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

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 ()
  • 你可以像下面这样将showputStrLn

    (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)?

    下一篇: How do I handle clicks on a listBox in Haskells gi