2

私はHaskellWiki > Existential type # Dynamic dispatch mechanismを見ています。動的ディスパッチ、スマートコンストラクタ、Template Haskellおそらく?

そして、私はこの部分を取るためにテンプレート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

Template Haskellで間違いなく実行できます。できないものはほとんどありません。しかし、私はTemplate 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の最高に、行うことができます。

+0

他の言葉で言えば、 "はい!Template Haskellはこれを行うことができます!" :) ConstraintKindsに関するヒントをありがとう、それはかなりクールです。 –

+0

えええええええええええええええええええええええええええええええええええええええええええええええと、手動でASTを分析して構築するのは楽しいことです。 – glaebhoerl

1

デフォルトの実装でShape_クラスにメソッドを追加することについてどのような:従来技術の場合

toShape :: a -> Shape 
toShape = Shape 

ExceptionクラスとSomeExceptionデータ型を参照してください。

+0

私は自動的に派生したスマートコンストラクタを期待しています。これはまだ 'circle r = toShape(Circle r)'などと書く必要があります。 –

関連する問題