использование 'def' в скриптах pandoc

Если вы посмотрите на документацию pandoc, вы увидите сценарии, написанные на Haskell. Я только недавно изучил основы Haskell, поэтому мне незнакомы некоторые идиомы, встречающиеся в этих скриптах.

Одна из вещей, которую я не понимаю, это использование def в этих скриптах. Например, вверху Text.Pandoc это следующий код:

 markdownToRST :: String -> String
 markdownToRST =
   (writeRST def {writerReferenceLinks = True}) . readMarkdown def

 main = getContents >>= putStrLn . markdownToRST

Что делает 'def' после readMarkdown и writeRST?


person melston    schedule 16.07.2014    source источник


Ответы (2)


В Haskell def — это просто имя переменной, ничего особенного. def в этом коде — это Data.Default.def. из пакета data-default. Он используется для доступа к значению по умолчанию. Возвращаемое значение по умолчанию зависит от типа, в котором оно используется. В этом случае он возвращает параметры записи по умолчанию и параметры чтения по умолчанию соответственно.

Чтобы выяснить это, вы можете использовать hoogle для поиска имен или типов в документации API пакетов Haskell. . В этом случае вы можете ввести +pandoc def для поиска имя def в документации API pandoc. Первый результат: Text.Pandoc.Options.def. Меня смутила сигнатура типа def, поэтому я щелкнул класс типа Default в сигнатуре, которая привела меня к документации пакета data-default.

В документации класса типа Default не упоминается ReaderOptions, потому что пакет data-default не знает о пакете pandoc. Но в Haskell классы типов открыты, поэтому пакет pandoc может добавить сам instance Default ReaderOptions. См. список экземпляров в документации ReaderOptions< /а>. Или посмотрите исходный код фактического объявления instance Default ReaderOptions здесь. .

person Toxaris    schedule 16.07.2014
comment
Ага. Я видел пакет data-default, но в нем нет ничего для ReaderOptions или WriterOptions, поэтому я не был уверен, что ищу не в том месте. Кроме того, def :: Default a => a меня все еще немного смущает. - person melston; 17.07.2014
comment
На самом деле, я должен был сказать, что я понимаю, что Default a => a просто ограничивает a типом Default, но не совсем знал, куда идти, чтобы узнать больше о фактических значениях по умолчанию или о том, что возвращалось в каждом из использование def выше. Я все еще привыкаю к ​​способу работы с Haskell, и документация не всегда так понятна для меня, как мне бы хотелось. - person melston; 17.07.2014
comment
Я понимаю. В этой ситуации я склонен искать фактическое объявление экземпляра в исходном коде (я начинаю со ссылки на источник в документации API типа, в данном случае ReaderOptions). - person Toxaris; 17.07.2014
comment
Ах. Я даже не видел ссылку на источник. Спасибо. - person melston; 17.07.2014

Он поступает из модуля Text.Pandoc.Options, который сам импортирует его из Data.Default , где он определяется просто как

class Default a where
    def :: a

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

person bheklilr    schedule 16.07.2014
comment
Спасибо. Это очень помогает, хотя я хотел бы найти где-нибудь, что это задокументировано (наряду с тем, что на самом деле представляют собой эти значения по умолчанию). - person melston; 17.07.2014
comment
@melston Если вы ищете значения по умолчанию для ReaderOptions и WriterOptions, они будут определены в Text.Pandoc.Options. Если вы посмотрите на документацию, то увидите, что каждый из них является экземпляром класса типов Default. Если вам нужны значения по умолчанию, проще всего загрузить GHCi и ввести :m Text.Pandoc.Options, а затем def :: ReaderOptions, в противном случае просто посмотрите здесь и здесь - person bheklilr; 17.07.2014
comment
@melston Из вашего другого комментария я вижу, что вас смущает def :: Default a => a. Что конкретно в нем вас смущает? Все это говорит о том, что для некоторого типа a, который реализует Default, существует значение def с типом a. Например, экземпляр для Int будет instance Default Int where def = 0. Вот и все, ничего особенного. Другой будет instance Default [a] where def = []. Все это просто для определения значений по умолчанию для различных типов, а в пакете data-default уже написано много значений по умолчанию для встроенных типов. - person bheklilr; 17.07.2014
comment
Ага. Я не очень ясно выразился по этому поводу. Я только что добавил комментарий, разъясняющий это. На языке Haskell def — это функция, которая возвращает a, где a должно быть типа Default, верно? Я пытался связать все это с readMarkdown и writeRST и терялся в процессе. Ваши ответы помогли вернуться в нужное русло. Спасибо. - person melston; 17.07.2014
comment
@мелстон Да. def – это функция, не принимающая аргументов, которая возвращает значение типа a, где a – экземпляр класса типов Default. Он знает, какой тип возвращать, исходя из контекста, поэтому, если я сказал def + (1 :: Int), компилятор знает, что def должен быть Int, и извлечет экземпляр Int для замены. В случае pandoc он видит, что для каждой из этих функций требуется ReaderOptions и WriterOptions, поэтому он извлекает экземпляры для тех типов, которые определены в Text.Pandoc.Options. - person bheklilr; 17.07.2014