pretty icon indicating copy to clipboard operation
pretty copied to clipboard

Doc 'Eq' instance fails Substitutivity

Open BenjaminCosman opened this issue 5 years ago • 1 comments

Consider the following code:

module Main (main) where
import Prelude hiding ((<>))
import Text.PrettyPrint

main :: IO ()
main = do
  let s1 = text "if:" $+$ nest 4 (text "pass")
  let s2 = text "if:\n    pass"
  let f = (text "x" <>)

  --not following Eq's Substitutivity 'law':
  --first is True but second is False
  print $   s1 ==   s2
  print $ f s1 == f s2

  --examine the values visually:
  print $   s1
  print $   s2
  print $ f s1
  print $ f s2
  --outputs the following (note extra space in the 3rd):
  -- if:
  --     pass
  -- if:
  --     pass
  -- xif:
  --      pass
  -- xif:
  --     pass

If this is not the intended behavior of the various functions involved (<>, $+$, nest, ==), then there is a bug that should be fixed. If this is the intended behavior, then the documentation on Eq should alert the reader to the fact that the Substitutivity Law is not followed.

BenjaminCosman avatar Jul 04 '20 03:07 BenjaminCosman

It could be documented that Eq instance witnesses equivalence (==) `on` render, thus for most combinators in the library substitutivity indeed doesn't hold.

pr welcome

phadej avatar Jul 05 '20 17:07 phadej