ダイナミックディスパッチ、スマートコンストラクター、テンプレートHaskellおそらく?

StackOverflow https://stackoverflow.com/questions/7802386

質問

私は見ています Haskellwiki>実存タイプ#動的ディスパッチメカニズム.

そして、私は考えています、テンプレートに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よりも強力な特別なプリプロセッサが必要ですか?

役に立ちましたか?

解決

テンプレート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

これらのインスタンス宣言を自動化することはもう1つのことであり、私の知る限り、できる限り、できることです。

他のヒント

にメソッドを追加するのはどうですか Shape_ デフォルトの実装を備えたクラス:

toShape :: a -> Shape
toShape = Shape

以前のアートについては、を参照してください Exception クラスと SomeException データ・タイプ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top