Haskell中函数应用运算符的使用

Posted

技术标签:

【中文标题】Haskell中函数应用运算符的使用【英文标题】:Use of function application operator in Haskell 【发布时间】:2017-03-24 06:01:28 【问题描述】:

下面的表达式在haskell中是什么意思?

($ 3)

ghci 显示如下类型

($ 3) :: Num a => (a -> b) -> b.

【问题讨论】:

【参考方案1】:

另一种看待它的方式是

($) :: (a -> b) -> a -> b
3 :: Num a => a

当你在($) 中“插入 3”时,它会变成

($ 3) :: Num a => (a -> b) -> b.

由于您不再需要提供 a,但您需要提供的函数现在仅限于 num,因为 3 可以是任何数字类型。

至少我是这样看待 Haskell 中的函数的,就像代数中的替换一样。

【讨论】:

【参考方案2】:

($ 3) 是一个部分,相当于\f -> f 3,它接受一个函数参数并将其应用于 3。

如果我们认为3 是一个整数,我们会得到f 的类型是Int -> b(对于任何b),所以($ 3) 的类型就是(Int -> b) -> b

Haskell 中的东西有点复杂,因为3 可以是任何数字类型,所以我们真的不需要f :: Int -> b,如果f :: a -> b 就足够了,其中a 是数字类型。

因此我们得到($ 3) :: Num a => (a -> b) -> b

【讨论】:

【参考方案3】:

(@ x) 对于任何运算符@ 等价于\a -> a @ x;所以($ 3) 等价于\f -> f $ 3,即一个函数应用你传递给3 的任何函数。这种语法称为“节”。

> let f = ($ 3)
> f show
"3"
> f square
9

【讨论】:

以上是关于Haskell中函数应用运算符的使用的主要内容,如果未能解决你的问题,请参考以下文章

Haskell中()的默认定义如何工作?

Haskell 中的函数应用

$ 在 Haskell 中是啥意思/做啥?

Haskell入门篇八:高阶函数(上)

范畴和函子,以及它们在 Haskell 中的应用——洪峰老师讲创客道(三十四)

在 Haskell 中即时减少列表