【问题标题】:Need help in understanding the function application operator in haskell需要帮助理解 haskell 中的函数应用运算符
【发布时间】:2017-09-28 06:56:21
【问题描述】:

这段haskell代码

map ($ 3) [(4+), (10*), (^2), sqrt]  

给出输出

[7.0,30.0,9.0,1.7320508075688772]  

我知道 $ 的优先级最低,因此 $ 右边的表达式被一起计算。但是我不明白 ($ 3) 是如何作为函数运行的(因为 Map 需要一个函数和一个列表作为参数)。我不明白为什么列表中的每个函数都应用于 3。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    记住($)实际上是一个函数:

    ($) :: (a -> b) -> a -> b
    f $ x = f x
    

    ($ 3)\f -> (f $ 3) 的简写。它的类型?嗯:

    3     ::                  Double -- for sake of simplicity
    ($)   :: (a      -> b) -> a      -> b
    ($ 3) :: (Double -> b)           -> b
    

    所以($ 3) 是一个函数,它从Double 获取一个函数并将该函数应用于3。现在,如果我们使用map,我们最终会得到:

    map ($ 3) [(4+), (10*), (^2), sqrt]  
     = [($ 3) (4+), ($ 3) (10*), ($ 3)(^2), ($ 3) sqrt]  
     = [(4+) $ 3, (10*) $ 3, (^2) $ 3, sqrt $ 3]  
     = [4 + 3, 10 * 3, 3 ^ 2, sqrt 3]
     = [7, 30, 9, sqrt 3]
    

    【讨论】:

    • 如果美元是一个函数,不应该将函数部分应用于参数而不是将函数应用于参数。我很确定我做错了什么:) 只是无法弄清楚我做错了什么
    • @Ashwin 错误,什么? “不应该将函数部分应用于参数而不是将函数应用于参数”是什么意思?
    • 我的意思是不应该是其他方式。 (4+) 应该以 3 作为参数而不是 3 以 (4+) 作为参数?
    • 没有。 ($3)(4+) 作为“参数”。记住($3)($3) = \f -> f $ 3 的简写,所以($3) (4+)(4+) 34 + 3
    【解决方案2】:

    我们先回顾一下($)的类型签名:

    ghci>> :t ($)
    ($) :: (a -> b) -> a -> b
    

    及定义:

    ($) f x = f x
    

    或者:

    f $ x = f x
    

    在上面,我们有一个部分,我们在其中创建了($) 的部分应用版本,第二个参数(a 类型)设置为3。现在,我们知道3 的类型为Num a => a,所以我们部分应用程序的类型签名必须是Num a => (a -> b) -> b

    接下来,让我们看看列表中的每个函数,每个函数都是 ($3) 的参数。正如预期的那样,它们是函数,事实证明它们的类型Num a -> a -> a 实际上比所需的约束更大(所以我们很好)。为了清楚起见,我们可以看看一个应用程序需要什么:

    ($3) (4+)
    

    我们可以在没有该部分的情况下重写为:

    ($) (4+) 3
    

    从上面的函数定义中可以很清楚地看出应用程序是如何进行的。

    最后一个令人困惑的部分可能是列表的类型($3) (4+) 评估为7,而不是repl 中的7.0。如果我们回想一下列表是同构的,并注意到列表中的一个函数sqrt 接受并返回一个浮点值,我们就会看到这种类型适用于所有应用程序。

    【讨论】:

    • 你是如何将 ($3) (4+) 重写为 ($) (4+) 3 的?
    • @Ashwin: ($3) = \f -> f $ 3\f -> ($) f 3 前缀表示法。将f 替换为(4+)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多