将"$"视为功能应用程序

0 haskell functional-programming

我在阅读" 了解你是一个很好的Haskell"时遇到了这个例子.

ghci> map ($ 3) [(4+), (10*), (^2), sqrt]  
[7.0,30.0,9.0,1.7320508075688772]  
Run Code Online (Sandbox Code Playgroud)

我不太明白如何将其$视为功能应用程序.这是否意味着$是运营商?但如果是这样,怎么会被嵌套+*在例子吗?我试过了$ 3 4+,$ 4 + 3但都提出来了parse error on input ‘$’.如何在函数式编程上下文中考虑这样的表达式?

mel*_*ene 12

$ 确实是一个运营商,定义为:

f $ x = f x
-- or equivalently:
($) f x = f x
Run Code Online (Sandbox Code Playgroud)

您上面的表达式(通过定义map)等效于:

[($ 3) (4 +), ($ 3) (10 *), ($ 3) sqrt]
Run Code Online (Sandbox Code Playgroud)

在括号($ 3)(4 +)是不可选的.它们是所谓的操作员部分的一部分.基本上,有四种方法可以使用中缀运算符(例如+):

  1. 两个论点之间:

    x + y
    
    Run Code Online (Sandbox Code Playgroud)
  2. 只给出第一个参数:

    (x +)
    -- like \y -> x + y
    
    Run Code Online (Sandbox Code Playgroud)
  3. 只给出第二个参数:

    (+ y)
    -- like \x -> x + y
    
    Run Code Online (Sandbox Code Playgroud)
  4. 没有参数:

    (+)
    -- like \x y -> x + y
    
    Run Code Online (Sandbox Code Playgroud)

($ 3) f评估以f $ 3评估为f 3.

($ 3) (4 +)求值以(4 +) $ 3进行求值以(4 +) 3进行求值以4 + 3进行求值7.