Динамическая диспетчерская, интеллектуальные конструкторы, возможно, шаблон Haskell?
-
22-10-2019 - |
Вопрос
Я смотрю Haskellwiki> Экзистенциальный тип # Динамический механизм диспетчеры.
И я думаю, в шаблоне Хаскелл должен быть способ принять эту часть:
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. Есть очень мало, чего не может. Но я считаю, что шаблон написания Код Хаскелла является довольно болезненным.
С 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
Автоматизация этих заявлений экземпляра - это еще одна вещь, и, насколько мне известно, это может сделать.
Другие советы
Как насчет добавления метода в Shape_
класс с реализацией по умолчанию:
toShape :: a -> Shape
toShape = Shape
Для предварительного искусства см. В Exception
класс и SomeException
тип данных.