Mar*_*ark 8 haskell function operators partial-application operator-sections
好吧,这是漫长的一天,我的大脑可能无法在Haskell级别上运行,但我无法理解"了解你一个Haskell"中的一个例子.
该部分称为带有$的函数应用程序,并且有一个如何$
定义的示例:
($) :: (a -> b) -> a -> b
f $ x = f x
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很清楚.我理解本节中的所有示例,除了最后一个:
ghci> map ($ 3) [(4+), (10*), (^2), sqrt]
[7.0,30.0,9.0,1.7320508075688772]
Run Code Online (Sandbox Code Playgroud)
这里我们映射($ 3)
函数列表并获得这些函数的应用结果3
.但这怎么可能呢?
从第一个代码片段可以看出,第一个参数是一个函数,我们甚至可以写:
*Main> ($) sqrt 4
2.0
Run Code Online (Sandbox Code Playgroud)
现在($ 3)
是功能的部分应用$
,但3
继续功能的位置!所以3
应该是一个功能还是什么?
还有另一个谜团:到底是(4+)
什么?我知道这(+4)
是部分应用功能+
,所以(4+)
应该部分应用功能4
吗?废话.什么样的伎俩在这里有效?
sep*_*p2k 13
($ 3)
而(+ 4)
不是局部的应用程序-它们是运营商的部分.部分应用程序看起来像(($) 3)
或((+) 4)
.
表单的运算符部分(? x)
(?
代表任意中缀运算符)绑定运算符的右操作数,即它等效于\y -> y ? x
.同样,运算符部分(x ?)
绑定左操作数,因此等同于部分应用程序.
我认为绊倒你的是操作员部分.这些让你与部分其参数任何一个应用的运营商,所以你可以有运营商(+4)
和(4+)
,这里4
是到第二个则第一个参数+
分别.一个更清晰的例子可能是("Hello" ++)
对(++ "world")
,前者预先"Hello"
插入字符串的前面,而后者附加"world"
到字符串的末尾.
这与使用前缀形式的运算符只是围绕它的parens形成对比.在这种形式中,以下内容是等效的:
> let join = (++)
> join "Hello, " "world"
"Hello, world"
> (++) "Hello, " "world"
"Hello, world"
Run Code Online (Sandbox Code Playgroud)
在前缀形式中,您将运算符视为普通函数,并按顺序接受其第一个和第二个参数.在操作符部分中,操作参数的哪一侧很重要.
所以在你的例子中,你有部分应用($ 3)
,你可以减少它
map ($ 3) [(4+), (10*), (^2), sqrt]
[($ 3) (4+), ($ 3) (10 *), ($ 3) (^ 2), ($ 3) sqrt]
[4 + 3, 10 * 3, 3 ^ 2, sqrt 3]
[7.0, 30.0, 9.0, 1.7320508075688772]
Run Code Online (Sandbox Code Playgroud)