Что такое законный грамотный Хаскелл? Формальный синтаксис где-то?

У кого-то была отличная идея объединить грамотные Haskell и Markdown. Мне показалось, поэтому я хотел попробовать. Но что-то Haskell не нравится в синтаксисе заголовка Markdown '#':

Hello World

> main = putStrLn "hello, world"

работает...

$ runhaskell hello_world.lhs 
hello, world

В то время как...

# Hello World #

> main = putStrLn "hello, world"

не...

$ runhaskell hello_world.lhs
hello_world.lhs:1:3: lexical error at character 'H'

Есть ли там определение того, что является законным? Синтаксис Haskell упоминает Literate Haskell на примере, и ничто не означает, что синтаксис Markdown недействителен.

Ответ 1

A '#' в первом столбце вызывает проблемы с GHCi, даже с пустыми строками до и после блоков кода. Если вы используете Pandoc, вы можете обойти эту проблему, используя подчеркивание для заголовков.

Hello World
-----------

>  main = putStrLn "hello, world"

Это известная проблема: http://hackage.haskell.org/trac/ghc/ticket/4836

Ответ 2

Прочтите это:

http://www.haskell.org/onlinereport/literate.html

В нем говорится, что для предотвращения ошибок вам нужна пустая строка между комментариями и кодом.

Ответ 3

Я использовал LHS с Pandoc, но Pandoc указывает, что кавычка с разделителями по трекам с птицами - элемент уровня абзаца, а параграфы в уценке Pandoc (и регулярной уценке) нужна пустая строка перед ними. Итак, следующее должно работать...

# Hello World #

> main = putStrLn "hello, world"