2

我正在查看HaskellWiki > Existential type # Dynamic dispatch mechanism

而且我在想,在 Template Haskell 中应该有一种方法来参与这部分:

class Shape_ a where
    ...

type Radius = Double
data Circle = Circle Radius

instance Shape_ Circle where
    ...

并自动推导出这部分:

-- derive the data type
data Shape = forall a. Shape_ a => Shape a

-- derive smart constructors similar to the original constructor
circle :: Radius -> Shape
circle r = Shape (Circle r)

这是在模板 Haskell 中完成的吗?这可以在 TH 中完成吗?是否可以在普通的旧 Haskell 中完成类似的操作,而无需手动写出所有智能构造函数?这是否需要一个比 TH 更强大的特殊预处理器?

4

2 回答 2

4

绝对可以使用 Template Haskell 来完成。很少有不能做的。但我发现编写模板 Haskell 代码相当痛苦。

使用 GHC 7.4 和ConstraintKinds扩展,您还可以抽象其中的一部分:

data Some :: (* -> Constraint) -> * where
    Some :: forall cls a. cls a => a -> Some cls

type Shape = Some Shape_

instance Shape_ Shape where
    perimeter (Some a) = perimeter a
    area (Some a) = area a

shape :: Shape_ a => a -> Shape
shape = Some

自动化这些实例声明是 TH 的另一件事,据我所知,只有 TH 可以做到。

于 2011-10-18T06:40:58.243 回答
1

Shape_向具有默认实现的类添加方法怎么样:

toShape :: a -> Shape
toShape = Shape

对于现有技术,请参阅Exception类和SomeException数据类型。

于 2011-10-18T06:34:38.340 回答