(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, если значения одинаковые. Потом пишешь класс, в котором диспатчишь по булеану. Потом еще один класс, в котором вместо булеана подставляется применение тайпфемили
Обсуждают сегодня