Haskell元组函数组合

Haskell元组函数组合,haskell,tuples,function-composition,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) pair (f, g) . h = (pair (f, g)) . h -- explicit preceden

我已经从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)
  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)

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

一种方法是扩展所有定义。记住
f。g=\x->f(gx)
fab=…
fa=\b->…
相同

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

您可以使用扩展性,即,如果两个函数在作用于任意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 :: (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)
如果我没有发出嘘声。。。希望这有帮助