【问题标题】:haskell type signature questionhaskell 类型签名问题
【发布时间】:2010-11-25 17:27:44
【问题描述】:

谁能解释一下,为什么要使用这些功能 有不同数量的参数和行为,但是 相同类型的签名,但它们都是正确的?

comp1 :: (a -> b) -> (b -> c) -> a -> c
comp1 f g = g.f

comp2 :: (a -> b) -> (b -> c) -> a -> c
comp2 f g x = g (f x)

还有,为什么comp2有

comp2 :: (a -> b) -> (b -> c) -> a -> c

而不是类似的东西

comp2 :: a -> (a -> b) -> (b -> c) -> a -> c

?

谢谢。

【问题讨论】:

标签: haskell type-signature


【解决方案1】:
comp2 f g x = g (f x)

是语法糖

comp2 = \f -> \g -> \x -> g (f x)

同样

comp1 f g = g.f

是糖

comp1 = \f -> \g -> g.f

.的定义是:

f1 . f2 = \x -> f1 (f2 x) -- Names of arguments have been changed to avoid confusion

因此,如果我们将定义插入到 comp1 的脱糖形式中,我们会得到:

comp1 = \f -> \g -> \x -> g (f x)

这与comp2 的脱糖形式完全相同,因此显然定义是等价的。

【讨论】:

    【解决方案2】:

    comp1 f g = g.fpoint-free 风格编写(不是指点,而是指)。当你调用comp1时,会隐式传递第三个参数给g.f,这是gf这两个函数的组合:(g.f) x等于g (f x),即g被传递f x 的结果。 comp1 中不存在参数 x,因为它已隐式传递给函数。 (您可以将comp1 视为部分应用curried 功能,如果它让您感觉更好的话。)

    comp2 的类型要求两个函数,一个来自(a->b),另一个来自(b->c),以及一个a 类型的参数。无需在其签名中添加a ->

    这两个功能真的是等价的;一个简单的使用一些 Haskell 技巧来更简洁。

    【讨论】:

      【解决方案3】:

      Currying。 ML 和 Haskell 中的多参数函数只是返回函数的单参数函数的语法糖;它返回的函数接受剩余的参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-22
        • 2016-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-15
        相关资源
        最近更新 更多