Как я могу создать данные с помощью шаблона Haskell

Могу ли я создать data haskell с помощью Template Haskell. Такие данные:

data Shape = Circle [Float] Double Int

Я хочу написать программу, которая создает данные, а затем использует их.


person Ivan    schedule 25.03.2016    source источник
comment
Попробуйте предоставить рабочий пример (его не нужно компилировать!) Или дополнительный контекст, чтобы мотивировать вопрос.   -  person hao    schedule 25.03.2016
comment
@haoformayor Я на самом деле думаю, что его вопрос хорошо сформулирован, и написание любого шаблона на Haskell довольно обременительно .... Доступной информации очень мало. Мне потребовались дни, прежде чем я смог написать даже самый простой рабочий фрагмент.   -  person jamshidh    schedule 25.03.2016
comment
Просто поместите его в соединение: [d| data Shape = Circle [Float] Double Int |] сделает свое дело.   -  person user2407038    schedule 26.03.2016


Ответы (1)


Вот минимальный пример (извините, я так и не понял, как сделать шаблон haskell красивым)....

Во-первых, создайте файл библиотеки (это не обязательно, TH требует, чтобы вы определяли выражения в отдельном файле).

module DataDefinition where

import Language.Haskell.TH

dataDef::DecsQ
dataDef = do
  return $ --the following is the definition "data Shape = Circle Float | Square"
        [DataD 
                [] 
                (mkName "shape") 
                [] 
                [
                        NormalC (mkName "circle") 
                                [(NotStrict, ConT (mkName "Float"))],
                        NormalC (mkName "Square") []
                ] 
                []
        ]

Затем используйте это так

module Main where

import DataDefinition

$(dataDef)  --This defines Shape

main = do
  let x = Circle 1.0 --Now you can define and use Shape like any other data def....
  return ()

дополнительный-

Вы можете заполнить этот последний пустой массив при создании DataD производными экземплярами.... Попробуйте изменить [] на

          [mkName "Show"]

и вы можете распечатать вывод в main....

main = do
  let x = Circle 1.0
  print x
person jamshidh    schedule 25.03.2016