为单向模式同义词手动指定同构
Manually specifying ismorphisms for unidirectional pattern synonym
可能没有办法做到这一点,但我只是想问问以防万一。
我有一个数据类型,它是一个像这样的简单元组:
data Tup a = T a a
我有一个这样的模式同义词:
pattern (:?) :: () => Floating a => a -> a -> Tup a
pattern (x :? y) <- T x (sqrt->y)
匹配 T x y
,但给出 y 平方根。所以:
let (_ :? y) = T 1 4 in y
是
2.0
我还希望能够使用 :?
作为构造函数,这样我就可以做一些很酷的事情,例如:
1 :? 2
评估为
T 1.0 4.0
当然我必须手动指定同构,但是是否有任何语法或语言功能可以让我获得这种行为?
从 GHC 7.10 开始,您可以使用
pattern (:?) :: () => Floating a => a -> a -> Tup a
pattern (x :? y) <- T x (sqrt->y) where
x :? y = T x (y^2)
我主要担心的是 sqrt
和 ^2
不是完全相反的,因为负数没有实平方根,而且浮点运算不精确。
可能没有办法做到这一点,但我只是想问问以防万一。
我有一个数据类型,它是一个像这样的简单元组:
data Tup a = T a a
我有一个这样的模式同义词:
pattern (:?) :: () => Floating a => a -> a -> Tup a
pattern (x :? y) <- T x (sqrt->y)
匹配 T x y
,但给出 y 平方根。所以:
let (_ :? y) = T 1 4 in y
是
2.0
我还希望能够使用 :?
作为构造函数,这样我就可以做一些很酷的事情,例如:
1 :? 2
评估为
T 1.0 4.0
当然我必须手动指定同构,但是是否有任何语法或语言功能可以让我获得这种行为?
从 GHC 7.10 开始,您可以使用
pattern (:?) :: () => Floating a => a -> a -> Tup a
pattern (x :? y) <- T x (sqrt->y) where
x :? y = T x (y^2)
我主要担心的是 sqrt
和 ^2
不是完全相反的,因为负数没有实平方根,而且浮点运算不精确。