为单向模式同义词手动指定ismorphisms

时间:2016-04-26 00:23:12

标签: haskell pattern-synonyms

可能没有办法做到这一点,但我只是想问以防万一。

我的数据类型是一个像这样的简单元组:

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

当然我必须手动指定同构,但有没有任何语法或语言功能可以让我得到这种行为?

1 个答案:

答案 0 :(得分:8)

从GHC 7.10开始,您可以使用

class Foo < AbstractModel
end

我主要担心的是pattern (:?) :: () => Floating a => a -> a -> Tup a pattern (x :? y) <- T x (sqrt->y) where x :? y = T x (y^2) sqrt并不是完全相反的,因为负数不具有真正的平方根,因为浮点运算是不精确的。