“$”是 haskell 中的函数吗?
Is '$' a function in haskell?
我对 haskell 中的 ($) 很困惑。
当我输入时
:t ($)
在 ghci 中。我会得到
:($) :: (a -> b) -> a -> b
但是,当我输入
:t ($ 3)
我会得到
($ 3) :: Num a => (a -> b) -> b
那么,为什么($)接受第二个参数没有任何错误?
嗯($)
是一个运算符,也就是一个中缀函数。它的定义非常简单(事实上,唯一使它有趣的是它的 固定性 ,而且我确信 google 有大量关于它的资源):
($) :: (a -> b) -> a -> b
f $ x = f x
与所有运算符一样,您可以通过仅应用第一个或仅应用第二个参数来获取它的 sections。添加 (+)
运算符可能会更明显:
(+ 2) -- equivalent to \x -> x + 2
(2 +) -- equivalent to \x -> 2 + x
($ 3)
也是如此 - 它等同于 \f -> f $ 3
。这个函数的类型应该很清楚了:它的参数 f
本身必须是一个接受数字和 returns 其他东西(f :: Num a => a -> b
)的函数,并且整个函数 returns 与 whatever f
returns 相同的类型。这给出了
(\f -> f $ 3) :: Num a => (a -> b) -> b
因此 ($ 3) :: Num a => (a -> b) -> b
。
我对 haskell 中的 ($) 很困惑。
当我输入时
:t ($)
在 ghci 中。我会得到
:($) :: (a -> b) -> a -> b
但是,当我输入
:t ($ 3)
我会得到
($ 3) :: Num a => (a -> b) -> b
那么,为什么($)接受第二个参数没有任何错误?
嗯($)
是一个运算符,也就是一个中缀函数。它的定义非常简单(事实上,唯一使它有趣的是它的 固定性 ,而且我确信 google 有大量关于它的资源):
($) :: (a -> b) -> a -> b
f $ x = f x
与所有运算符一样,您可以通过仅应用第一个或仅应用第二个参数来获取它的 sections。添加 (+)
运算符可能会更明显:
(+ 2) -- equivalent to \x -> x + 2
(2 +) -- equivalent to \x -> 2 + x
($ 3)
也是如此 - 它等同于 \f -> f $ 3
。这个函数的类型应该很清楚了:它的参数 f
本身必须是一个接受数字和 returns 其他东西(f :: Num a => a -> b
)的函数,并且整个函数 returns 与 whatever f
returns 相同的类型。这给出了
(\f -> f $ 3) :: Num a => (a -> b) -> b
因此 ($ 3) :: Num a => (a -> b) -> b
。