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

3
以下是该表达式在Haskell中的含义?
($ 3)

ghci显示以下类型

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

8
($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

6
对于任何运算符@,(@ x)等同于\a -> a @ x;因此,($ 3)等同于\f -> f $ 3,即将任何传递给它的函数应用于3。这种语法称为“部分应用”。
> let f = ($ 3)
> f show
"3"
> f square
9

3
另一种看待它的方式是:
($) :: (a -> b) -> a -> b
3 :: Num a => a

当你在($)中插入数字3时,它将变成

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

由于您不再需要提供a,但您需要提供的函数现在仅限于num,因为3可以是任何数值类型。至少这是我在Haskell中看待函数的方式,就像代数中的替换一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接