shareBindings ExpA (IfThenElseE test (LetE v1 tau1 occ1 e1a e1b) (LetE v2 tau2 occ2 e2a e2b)) = do
    e1a' <- shareBindings ExpA e1a
    e2a' <- shareBindings ExpA e2a
    if e1a' == e2a'
       then do  insertSubst VarA v2 VarA v1
                LetE v1 tau1 (occJoin occ1 occ2) e1a' <$> shareBindings ExpA (IfThenElseE test e1b e2b)
       else do  e1 <- LetE <$> shareBindings VarA v1
                           <*> shareBindings TypeA tau1
                           <*> pure occ1
                           <*> pure e1a'
                           <*> shareBindings ExpA e1b
                e2 <- LetE <$> shareBindings VarA v2
                           <*> shareBindings TypeA tau2
                           <*> pure occ2
                           <*> pure e2a'
                           <*> shareBindings ExpA e2b
                IfThenElseE <$> shareBindings ExpA test <*> pure e1 <*> pure e2
shareBindings ExpA (IfThenElseE test (LetE v1 tau1 occ1 e1a e1b) (LetE v2 tau2 occ2 e2a e2b)) = do
    e1a' <- shareBindings ExpA e1a
    e2a' <- shareBindings ExpA e2a
    if e1a' == e2a'
       then do  insertSubst VarA v2 VarA v1
                LetE v1 tau1 (occJoin occ1 occ2) e1a' <$> shareBindings ExpA (IfThenElseE test e1b e2b)
       else do  e1 <- LetE <$> shareBindings VarA v1
                           <*> shareBindings TypeA tau1
                           <*> pure occ1
                           <*> pure e1a'
                           <*> shareBindings ExpA e1b
                e2 <- LetE <$> shareBindings VarA v2
                           <*> shareBindings TypeA tau2
                           <*> pure occ2
                           <*> pure e2a'
                           <*> shareBindings ExpA e2b
                IfThenElseE <$> shareBindings ExpA test <*> pure e1 <*> pure e2
shareBindings ExpA (IfThenElseE test (LetE v1 tau1 occ1 e1a e1b) (LetE v2 tau2 occ2 e2a e2b)) = do
    e1a' <- shareBindings ExpA e1a
    e2a' <- shareBindings ExpA e2a
    if e1a' == e2a'
       then do  insertSubst VarA v2 VarA v1
                LetE v1 tau1 (occJoin occ1 occ2) e1a' <$> shareBindings ExpA (IfThenElseE test e1b e2b)
       else do  e1 <- LetE <$> shareBindings VarA v1
                           <*> shareBindings TypeA tau1
                           <*> pure occ1
                           <*> pure e1a'
                           <*> shareBindings ExpA e1b
                e2 <- LetE <$> shareBindings VarA v2
                           <*> shareBindings TypeA tau2
                           <*> pure occ2
                           <*> pure e2a'
                           <*> shareBindings ExpA e2b
                IfThenElseE <$> shareBindings ExpA test <*> pure e1 <*> pure e2