Haskell的函数应用程序运算符($)用法

Bre*_*dan 6 haskell functional-programming

我正在读Bartosz Milewski撰写的一篇文章,其中他定义了以下功能:

instance Applicative Chan where
  pure x = Chan (repeat x)
  (Chan fs) <*> (Chan xs) = Chan (zipWith ($) fs xs)
Run Code Online (Sandbox Code Playgroud)

为什么函数应用程序运算符在括号中?我理解这通常是为了在前缀表示形式中使用中缀函数,但我不明白为什么,在这种情况下,函数不能简单地表达为Chan (zipWith $ fs xs),并想知道它之间的区别是什么二是.

(如果您仍需要上下文,请参阅文章)

Tik*_*vis 13

在这种情况下,$正在传递zipWith.这和写作一样

zipWith (\ f x ->  f x) fs xs
Run Code Online (Sandbox Code Playgroud)

没有括号,它本来就相当于

zipWith (fs xs)
Run Code Online (Sandbox Code Playgroud)

哪个不会出现问题.

括号中的运算符与普通标识符完全相同.具有以下定义:

apply = ($)
Run Code Online (Sandbox Code Playgroud)

代码可能看起来像

zipWith apply fs xs
Run Code Online (Sandbox Code Playgroud)

  • 具体来说,haskell的语法要求你说`zipWith <expr>`,其中`<expr>`是一个表达式.`($)`是中缀运算符`$`转换为*表达式*,与"转换为前缀"略有不同,允许用作前缀函数和用作其他函数的参数. (2认同)