在pandoc脚本中使用'def'

时间:2014-07-16 19:23:07

标签: haskell pandoc

如果查看pandoc文档,您会看到用Haskell编写的脚本。我最近才学习了Haskell的基础知识,所以我不熟悉这些脚本中似乎出现的一些习语。

我不明白的一件事是在这些脚本中使用def。例如,Text.Pandoc的顶部是以下代码:

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

 main = getContents >>= putStrLn . markdownToRST

' def'在readMarkdownwriteRST之后做什么?

2 个答案:

答案 0 :(得分:7)

在Haskell中,def只是一个变量名,没什么特别的。此代码中的defData.Default.def包中的data-default。它用于访问默认值。它返回的默认值取决于它所使用的类型。在这种情况下,它分别返回默认的writer选项和默认的reader选项。

要解决这个问题,您可以使用hoogle在Haskell软件包的API文档中搜索名称或类型。在这种情况下,您可以搜索+pandoc def以在pandoc API文档中搜索名称def。第一个结果是Text.Pandoc.Options.def。我对def的类型签名感到困惑,所以我点击了签名中的Default类型类,它将我带到了data-default包的文档。

Default类型类的文档没有提及ReaderOptions,因为数据默认包并不知道pandoc包。但是在Haskell中,类型类是开放的,因此pandoc包可以添加instance Default ReaderOptions本身。请参阅ReaderOptions文档中的实例列表。或者查看实际instance Default ReaderOptions声明here的源代码。

答案 1 :(得分:3)

它来自Text.Pandoc.Options模块,它本身是从Data.Default导入的,在那里它被定义为

class Default a where
    def :: a

它只是为实现它的类型定义“默认”值,与mempty中的Monoid非常相似,但没有您定义mappend的限制。