There probably isn't a way to do this, but I just wanted to ask just in case.
I have a data type that's a simple tuple like this:
data Tup a = T a a
I have a pattern synonym like this:
pattern (:?) :: () => Floating a => a -> a -> Tup a
pattern (x :? y) <- T x (sqrt->y)
That matches on T x y, but gives y square rooted. so:
let (_ :? y) = T 1 4 in y
is
2.0
I'd also like to be able to use :? as a constructor, so I'd be able to do cool things like:
1 :? 2
evaluating to
T 1.0 4.0
Of course I'd have to manually specify the isomorphism, but is there any syntax or language feature that would enable me to get this behavior?
As of GHC 7.10, you can use
pattern (:?) :: () => Floating a => a -> a -> Tup a
pattern (x :? y) <- T x (sqrt->y) where
x :? y = T x (y^2)
My main concern is that sqrt and ^2 are not quite inverses, both because negative numbers don't have real square roots and because floating point arithmetic is imprecise.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With