Consider the numeric literal 1
. It has a different type depending on whether it's used on the left or right of the equals sign. In f True = 1
, 1
has type Num p => p
. But in f 1 = True
, 1
has type (Eq a, Num a) => a
. Is it possible to create a pattern synonym that works the same way? For example:
pattern LooksLikeFoo :: (Read a, Show a) => a
pattern LooksLikeFoo <- (show -> "Foo")
where LooksLikeFoo = read "Foo"
That pattern only works if it has both the Read
and Show
classes, no matter which side of the equals sign it's on. Is there a way to make it have type Show a => a
on the left side of the equals sign, but Read a => a
on the right side? Non-working pseudo-code:
pattern LooksLikeFoo :: Show a => a
pattern LooksLikeFoo <- (show -> "Foo")
where LooksLikeFoo :: Read a => a
LooksLikeFoo = read "Foo"
This is not possible currently but it has been brought up by Edward Kmett as a possibility a few times, for example: https://www.reddit.com/r/haskell/comments/eqhcgx/comment/fetsa54