use of 'def' in pandoc scripts

haskell, pandoc

Solution

In Haskell, `def` is just a variable name, nothing special. The `def` in this code is `Data.Default.def` from the data-default package. It is used to access a default value. The default value it returns depends on the type it is used at. In this case, it returns the default writer options and default reader options, respectively.

To figure such things out, you can use hoogle to search for names or types in the API documentation of Haskell packages. In this case, you can search for +pandoc def to search for the name `def` in the pandoc API documentation. The first result is `Text.Pandoc.Options.def`. I was confused by the type signature of `def`, so I clicked on the `Default` type class in the signature which took me to the documentation of the `data-default` package.

The documentation of the `Default` type class doesn't mention `ReaderOptions`, because the data-default package doesn't know about the pandoc package. But in Haskell, type classes are open, so the pandoc package can add the `instance Default ReaderOptions` itself. See the list of instance in the documentation of `ReaderOptions`. Or see the source code for the actual `instance Default ReaderOptions` declaration here.

Problem

If you look at the pandoc documentation you see scripts written in Haskell. I have only recently learned the basics of Haskell so I am unfamiliar with some of the idioms that seem to appear in these scripts. One of the things that I don't understand is the use of `def` in these scripts. For example, at the top of Text.Pandoc is the following code: ``` markdownToRST :: String -> String markdownToRST = (writeRST def {writerReferenceLinks = True}) . readMarkdown def main = getContents >>= putStrLn . markdownToRST ``` What does the 'def' do after the `readMarkdown` and the `writeRST`?

Original source