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

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

($ 3)

ghci 显示如下类型

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

【问题讨论】:

    标签: function haskell operators function-calls


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-20
          • 1970-01-01
          • 1970-01-01
          • 2014-06-26
          • 1970-01-01
          • 2017-02-06
          • 2013-08-13
          相关资源
          最近更新 更多