ダイナミックディスパッチ、スマートコンストラクター、テンプレートHaskellおそらく?
-
22-10-2019 - |
質問
私は見ています 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
データ・タイプ。
所属していません StackOverflow