识字Haskell:参考和索引

Dee*_*ech 15 haskell literate-programming

Literate Haskell是否支持索引函数名,类型类和变量引用?是否有一个我可以在Literate Haskell源上运行的过滤器,它将执行此操作,并为我提供一个很好的PDF手册或一个超链接的HTML文档.

这些是nowebCWEB的一个非常好的功能,我认为它会刺激Literate Haskell的广泛采用.

例如,查看用CWEB编写的单词计数程序.项目#4中第一页上的代码块使用了该代码的使用位置.LHS不支持块,但我想知道代码的使用位置:

  1. 评论func.

    func = id

    用于:(XYZf,ABCg,第1.5节)

    func2 = indefined

    用于:(ABCx,第2.1节)

此外,还有一个索引,它汇总了所有函数名称和变量,以及它们在文档中引用的位置以及其他函数等.

Fed*_*ini 1

Latex中有一些可能性,下面使用包listings和makeindex来创建所有函数的列表。此外, \label 用于在不同部分之间创建交叉引用:

\documentclass[a4paper,11pt,reqno,twoside,pdflatex,makeidx]{amsart}

\usepackage[a4paper]{geometry}

\usepackage{listings}
\lstloadlanguages{Haskell}

\lstset{
    flexiblecolumns=false,
    basewidth={0.5em,0.45em},
    basicstyle=\ttfamily,
    language=haskell,
    % numbers=left, % optional numbering of code lines
    firstnumber=last,
    numberstyle=\tiny,
    stepnumber=2,  
    numbersep=5pt,
    index={fac,fac2}
}

\lstnewenvironment{code}{}{}

\usepackage{hyperref}

\title{The factorial function}
\author{Federico Squartini}
\date{}


\makeindex

\begin{document}
\maketitle
\section{Factorial function}
\label{code:fac1}
The factorial function can be defined as:

\begin{code}

fac 0 = 1
fac n = n * fac (n-1)

\end{code}
  
\section{Factorial function in constant space}
The code for the factorial defined section~\ref{code:fac1} uses $o(n)$ stack
space. The following function uses constant space:

\begin{code}

fac2 n = go 1 1
    where
      go !acc i| i <= n = go (acc*i) (i+1)
               | otherwise = acc

\end{code}

\printindex
\end{document}
Run Code Online (Sandbox Code Playgroud)

编译:

pdflatex 示例.tex

makeindex 示例.idx

pdflatex 示例.tex

pdflatex 示例.tex

生成的 pdf 在这里。这对于生成 pdf 文件非常有用。对于其他类型的输出(例如 html),您应该将 Latex 与pandoc一起使用。

另一种选择是使用 pandoc 的 markdown 语法,与临时乳胶命令(\label 和 makeindex)混合。这应该会简化任务并减少源文件中的语法噪音。