Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

use of 'def' in pandoc scripts

Tags:

haskell

pandoc

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?

like image 667
melston Avatar asked Jul 16 '14 19:07

melston


2 Answers

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.

like image 99
Toxaris Avatar answered Nov 20 '22 15:11

Toxaris


It comes from the Text.Pandoc.Options module, which itself is importing it from Data.Default, where it's defined simply as

class Default a where
    def :: a

It's just defining a "default" value for types that implement it, very similar to mempty from Monoid but without the restriction that you define mappend.

like image 24
bheklilr Avatar answered Nov 20 '22 13:11

bheklilr