Динамическая рассылка, умные конструкторы, Шаблон Haskell возможно? - PullRequest
2 голосов
/ 18 октября 2011

Я смотрю на HaskellWiki> Экзистенциальный тип # Механизм динамической отправки .

И я думаю, в Template 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)

Это было сделано в Template Haskell?Можно ли это сделать в TH?Может ли нечто подобное быть сделано в простом старом Хаскеле без необходимости выписывать все умные конструкторы вручную?Требуется ли для этого специальный препроцессор, более мощный, чем TH?

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Определенно это можно сделать с помощью шаблона 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.

1 голос
/ 18 октября 2011

Как насчет добавления метода в класс Shape_ с реализацией по умолчанию:

toShape :: a -> Shape
toShape = Shape

Для уровня техники см. Класс Exception и тип данных SomeException.

...