动态调度,智能构造函数,模板Haskell也许?

时间:2011-10-18 04:22:50

标签: haskell existential-type template-haskell dynamic-dispatch

我在看HaskellWiki > Existential type # Dynamic dispatch mechanism

而且我在思考,模板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)

这是在Template Haskell中完成的吗?这可以在TH中完成吗?在普通的旧Haskell中可以做类似的事情,而不必手工写出所有的智能构造函数吗?这需要一个比TH更强大的特殊预处理器吗?

2 个答案:

答案 0 :(得分: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可以做到。

答案 1 :(得分:1)

如何使用默认实现向Shape_类添加方法:

toShape :: a -> Shape
toShape = Shape

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