【发布时间】:2017-03-24 06:01:28
【问题描述】:
下面的表达式在haskell中是什么意思?
($ 3)
ghci 显示如下类型
($ 3) :: Num a => (a -> b) -> b.
【问题讨论】:
标签: function haskell operators function-calls
下面的表达式在haskell中是什么意思?
($ 3)
ghci 显示如下类型
($ 3) :: Num a => (a -> b) -> b.
【问题讨论】:
标签: function haskell operators function-calls
另一种看待它的方式是
($) :: (a -> b) -> a -> b
3 :: Num a => a
当你在($) 中“插入 3”时,它会变成
($ 3) :: Num a => (a -> b) -> b.
由于您不再需要提供 a,但您需要提供的函数现在仅限于 num,因为 3 可以是任何数字类型。
至少我是这样看待 Haskell 中的函数的,就像代数中的替换一样。
【讨论】:
($ 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。
【讨论】:
(@ x) 对于任何运算符@ 等价于\a -> a @ x;所以($ 3) 等价于\f -> f $ 3,即一个函数应用你传递给3 的任何函数。这种语法称为“节”。
> let f = ($ 3)
> f show
"3"
> f square
9
【讨论】: