我已经开始使用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.如果我没有发出嘘声。。。希望这能有所帮助!