2017-02-20 21 views
3

Я пытаюсь работать с основными типами данных GHC. Я могу скомпилировать свой источник Haskell в ядро ​​с типом Bind CoreBndr. Как мы знаем, экземпляр Show по умолчанию для этого типа данных отсутствует. Существует способ распечатать это представление, но у него слишком много шумов, связанных с ним. Я хочу рассматривать ядро ​​GHC как любой другой тип алгебраических данных и записывать с ним функции. Было бы намного проще, если бы у нас был экземпляр ядра GHC Show. Кто-нибудь уже написал экземпляр шоу, который я могу повторно использовать?экземпляр `Show` для ядра GHC

Кроме того, как сообщество пишет и проверяет программы, которые имеют дело с ядром GHC?

+0

Какого шума вы говорите? –

+0

Вывод из 'ghc -c file.hs -ddump-simple' дает основное представление программы pertty, напечатанной с явными типами, проверками аргументов словаря и т. Д., Но в контексте программы представление ядра представляет собой просто значение некоторого типа данных , – ankitrokdeonsns

+0

Основная цель ядра - не печатать; это внутренний, низкоуровневый язык, дизайн которого в значительной степени выгоден компилятору, а не человеческому программисту. Тем не менее, «я хочу рассматривать ядро ​​GHC как любой другой тип алгебраических данных и записывать с ним функции» - это уже точно так. Core буквально просто Haskell ADT - что заставляет вас верить иначе? Обратите внимание, что в GHC api уже есть [красивый принтер для ядра] (https://www.stackage.org/haddock/lts-8.2/ghc-8.0.2/PprCore.html). – user2407038

ответ

1

Поехав мусорный контейнер дайвинга в GHC и обдумывал тот же вопрос, я могу с уверенностью сказать, что наивная реализация Show в GHC является НЕ, что вы хотите. Причина этого заключается в том, что внутри GHC имеет рекурсию среди многих своих типов данных. Например, между TyCon, AlgTyConRhs и DataCon мы имеем:

TyCon имеет AlgTyCon, который содержит AlgTyConRhs.

AlgTyConRhs содержит data_cons :: [DataCon] как одно из своих полей записи.

DataCon содержит dcRepTyCon :: TyCon как одно из своих полей.

И таким образом мы получаем полный круг. Из-за того, как работает Show, такая рекурсия создаст бесконечный вывод, если вы когда-нибудь попытаетесь его распечатать.

Чтобы получить «приятное» пользовательское представление с конструкторами данных и всем, что вам нужно, вам придется написать его самостоятельно. Это на самом деле несколько сложно, так как вам приходится рассматривать и отлаживать случаи рекурсии, подобные этим, которые решили по умолчанию довольно принтеры.

Это были открыты утомительные, много вкладок, но это хороший опыт :)