3

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

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

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

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

4

1 回答 1

8

从 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完全相反的,既因为负数没有实数平方根,又因为浮点运算不精确。

于 2016-04-26T01:01:32.407 回答