Haskell元组函数组成

时间:2013-08-24 19:29:10

标签: haskell tuples function-composition

我已经开始使用Richard Bird的Haskell从FP简介中学习Haskell,但我不得不证明以下内容:

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

对的定义如下:

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

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

3 个答案:

答案 0 :(得分:4)

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

因此,您可以尝试在pair

中扩展.pair (f, g) . h = pair (f . h, g . h)的定义

答案 1 :(得分:3)

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

因此,在这种情况下,您可以采用您尝试证明的相等性,在每个方面对相应类型的某些 x 进行操作,并显示在两种情况下都获得相同的结果。

答案 2 :(得分:2)

小心,扰乱!我将在下面解释完整的证明,如果你想自己尝试按照@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如果我没有嘘声......希望这有帮助!