2011-07-18 15 views
15

¿Alfabetizador Haskell admite nombres de funciones de indexación, clases de tipos y referencias de variables? ¿Hay algún filtro que pueda ejecutar en la fuente Literate Haskell que lo haga y me proporcione un buen manual en PDF o un documento HTML hipervinculado?Literal Haskell: referencias e indexación

Estas son unas características realmente agradables de noweb y CWEB que creo que estimularían la adopción generalizada de Literate Haskell.

Como un ejemplo, mira el word count program escrito en CWEB. El fragmento de código en la primera página en el ítem n. ° 4 se encuentra al pie de página donde se usa ese código. LHS no admite fragmentos pero me gustaría saber dónde se está utilizando el código:

  1. Comentario que describe func.

    func = id

    Se utiliza en: (XYZf, ABCG, Sección 1,5)

    func2 = indefined

    utilizan en: (ABCX, Sección 2,1)

Y adicionalmente un índice que agrega toda la función nombres y variables a lo largo de donde se hace referencia en el documento y por otras funciones, etc.

+0

Creo que debería ser fácil emular esto mediante un uso creativo de LaTeX. – fuz

+0

Actualmente, Haddock y el comando ": info" me muestran instancias de una clase de tipo. Pero no puedo ver dónde se usan las funciones y las variables. – Deech

+0

Al "indexar", ¿se refiere a un índice que vincula cada nombre a su documentación, como produce Haddock? – Heatsink

Respuesta

1

Hay algunas posibilidades en Latex, las siguientes usan el paquete listings, junto con makeindex para crear una lista de todas las funciones. Además \ etiqueta se utiliza para crear referencias cruzadas entre diferentes secciones:

\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} 

compilar con:

pdflatex example.tex

makeindex example.idx

example.tex pdflatex

pdflatex example.tex

El pdf resultante es here. Esto es ideal para producir archivos pdf. Para otro tipo de salidas (por ejemplo, html) debe usar latex junto con pandoc.

Otra opción es usar la sintaxis de reducción de Pandoc, mezclada con comandos de látex ad hoc (\ label y makeindex). Esto debería simplificar la tarea y producir menos ruido sintáctico en los archivos fuente.

+0

Esto es increíblemente bueno, pero en última instancia no es lo que estoy buscando, ya que requiere la intervención manual utilizando la etiqueta para determinar los nombres de las funciones. ¡Gracias por la lección de látex! – Deech

Cuestiones relacionadas