为什么它适用第二个参数?

zer*_*ing 1 haskell

我试图理解应用仿函数的交换法则:

u <*> pure y = pure ($ y) <*> u
Run Code Online (Sandbox Code Playgroud)

让我困惑的是,函数应用程序$ y,请考虑以下示例:

($ 2) :: (a -> b) -> b 
Run Code Online (Sandbox Code Playgroud)

为什么第二个参数不应用于第一个?

lef*_*out 6

这是一个操作员部分.一些简单的例子:

Prelude> (/2) <$> [1..8]
[0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0]
Prelude> (:"!") <$> ['a'..'e']
["a!","b!","c!","d!","e!"]
Run Code Online (Sandbox Code Playgroud)

该部分(:"!")是语法糖\c -> c:"!",即它需要一个字符c并将其预先添加到字符串中"!".

同样,该部分($ 2)采用一个函数f并简单地应用于数字2.

请注意,这与普通的部分应用程序不同:

Prelude> ((/) 2) <$> [1..8]
[2.0,1.0,0.6666666666666666,0.5,0.4,0.3333333333333333,0.2857142857142857,0.25]
Run Code Online (Sandbox Code Playgroud)

在这里,我只是将函数(/)应用于一个固定的参数2,即被除数.这也可以写成左侧部分 (2/).但是正确的部分(/2)适用2除数.

  • @zero_coding` $`是一个中缀运算符,第一个参数在它之前写入,第二个参数在它之后写入.`($ 2)`与`(2 $)`不一样 (2认同)