(v2 :: ProtocolVersion) where
                  
                  
                      ifSame :: forall a . a -> a -> a
                  
                  
                  
                  
                  
                  instance SameProtocol v v where ifSame a _ = a
                  
                  
                  instance SameProtocol v1 v2 where ifSame _ b = b
                  
                  
                  -- ... 
                  
                  
                  
                  
                  
                  withCommonChecks :: forall (sessionProtocolVersion :: ProtocolVersion) (messageProtocolVersion :: ProtocolVersion) a . Session sessionProtocolVersion -> Messsage messageProtocolVersion = 
                  
                  
                  ifSame @sessionProtocolVersion @messageProtocolVersion ifSame ifDifferent 
                  
                  
                  where 
                  
                  
                    ifSame = ...
                  
                  
                    ifDifferent = ...
                  
                  
                  во-первых хочет аж IncoherentInstances, а во-вторых странно ругается  про
                  
                  
                  Cannot apply expression of type ‘IO (Either (APdu, Text) APdu)’
                  
                  
                        to a visible type argument ‘sessionProtocolVersion’
                  
                  
                
возможно из-за того что ifSame два разных
case eqT @v1 @v2 of Just _ -> ifSame Nothing -> ifDifferent
определяешь тайпфемелю, которая возвращает True, если значения одинаковые. Потом пишешь класс, в котором диспатчишь по булеану. Потом еще один класс, в котором вместо булеана подставляется применение тайпфемили
Обсуждают сегодня