Динамическая диспетчерская, интеллектуальные конструкторы, возможно, шаблон Haskell?

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

Вопрос

Я смотрю 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 тип данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top