【问题标题】:Haskell tuple function compositionHaskell 元组函数组合
【发布时间】:2013-08-24 19:29:09
【问题描述】:

我已经从 Richard Bird 的 Introduction to FP using Haskell 开始学习 Haskell,但我坚持要证明以下几点:

pair (f, g) . h = pair (f . h, g . h)

pair的定义如下:

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

有人能指出我正确的方向吗?请记住,我只是在开始。提前致谢!

【问题讨论】:

    标签: haskell tuples function-composition


    【解决方案1】:

    一种方法是扩展所有定义。请记住,f . g = \x -> f (g x)f a b = ...f a = \b -> ... 相同。

    因此您可以尝试在pair (f, g) . h = pair (f . h, g . h) 中扩展pair. 的定义

    【讨论】:

      【解决方案2】:

      您可以使用 extensionality,即如果两个函数在作用于任何 x 时给出相同的结果,那么它们被认为是相同的(作为纯函数 - 它们可能有不同的代码,因此有不同的时间/空间使用)。

      因此,在这种情况下,您可以采用您要证明的等式,在适当类型的某个 x 上对每一方采取行动,并表明您在两种情况下都获得了相同的结果。

      【讨论】:

        【解决方案3】:

        小心,剧透!我将在下面解释完整的证明,如果您想自己尝试,请遵循@nponeccop 的建议并尝试扩展您的函数调用;)

        证明

        知道:

        f . g = \x -> f (g x)
        
        pair :: (a -> b, a -> c) -> a -> (b, c)
        pair (f, g) x = (f x, g x)
        

        而中缀组合运算符.的优先级低于函数应用,可以这样算:

          pair (f, g) . h
        = (pair (f, g)) . h            -- explicit precedence
        = \x -> (pair (f, g)) (h x)    -- expanding the composition operator
        = \x -> (f (h x), g (h x))     -- expanding 'pair'
        = \x -> ((f . h) x, (g . h) x) -- using the composition operator
        = \x -> pair (f . h, g . h) x  -- back to 'pair'
        = pair (f . h, g . h)
        

        Q.E.D,如果我没有发出嘘声...希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 2016-04-30
          • 2010-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多