Haskell元组函数组合



我已经开始使用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)

有人能给我指正确的方向吗?请记住,我才刚刚开始。提前感谢!

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

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

您可以使用扩展性,即,如果两个函数在对任何x执行操作时给出相同的结果,则它们被认为是相同的(作为纯函数,它们可能具有不同的代码,因此使用不同的时间/空间)。

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

小心,剧透!我将在下面解释完整的证明,如果你想自己尝试,请遵循@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.如果我没有发出嘘声。。。希望这能有所帮助!

最新更新