如何在Haskell中证明组合运算(。)的关联律

时间:2016-03-24 04:02:48

标签: haskell

说,

    f :: a -> b 
    g :: b -> c 
    h :: c -> d

为什么等式

    h.(g.f) = (h.g).f  

是对的? 怎么证明呢? 组合操作只是Haskell中的基本操作, 或者我们可以自己买一个?如果是这样,如何实现呢?

1 个答案:

答案 0 :(得分:4)

您可以自己定义合成运算符,如下所示:

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

现在,要证明相关性:

lhs = h . (g . f)
    = \x -> h ((g . f) x)         -- substitution
    = \x -> h ((\y -> g (f y)) x) -- substitution
    = \x -> h (g (f x))           -- beta reduction

rhs = (h . g) . f
    = \x -> (h . g) (f x)         -- substitution
    = \x -> (\y -> h (g y)) (f x) -- substitution
    = \x -> h (g (f x))           -- beta reduction

现在,我们有lhs = rhs。 QED。