如果查看pandoc文档,您会看到用Haskell编写的脚本。我最近才学习了Haskell的基础知识,所以我不熟悉这些脚本中似乎出现的一些习语。
我不明白的一件事是在这些脚本中使用def
。例如,Text.Pandoc的顶部是以下代码:
markdownToRST :: String -> String
markdownToRST =
(writeRST def {writerReferenceLinks = True}) . readMarkdown def
main = getContents >>= putStrLn . markdownToRST
' def'在readMarkdown
和writeRST
之后做什么?
答案 0 :(得分:7)
在Haskell中,def
只是一个变量名,没什么特别的。此代码中的def
是Data.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
的限制。