Как создать пример многострочного кода Haddock, который можно вставить в GHCi / WinGHCi - PullRequest
0 голосов
/ 19 июня 2020

Я пишу документацию Haddock для разработанной мной библиотеки. Я хочу включить пример с выводом, который легко скопировать и вставить в GHCi / WinGHCi. Некоторые примеры кода довольно длинные и их трудно читать, если они не занимают несколько строк.

Хотя шаги, которые я показал ниже, работают, их будет довольно болезненно использовать. Я делаю что-нибудь глупое? Есть ли способ сделать это проще для людей, которые хотят попробовать примеры? Спасибо!

Я использую GH C 8.4.3 на Windows.

Этот код (который, очевидно, намного проще, чем мой реальный пример кода) иллюстрирует проблемы:

{-$Example

>>> :{
>>> let x = 3
>>>     y = 4
>>> in x + y
>>> :}
7

-}

Вышеупомянутое включено в исходный файл .hs.

После запуска Haddock и просмотра файла html вы увидите на веб-странице следующее:

>>> :{
>>> let x = 3
>>> y = 4
>>> in x + y
>>> :}
7

Что, чтобы вставить в GHCi, вам нужно:

  1. скопировать в другое место
  2. удалить маркеры >>> в начале каждой строки
  3. добавьте интервал перед y

(Это также предполагает, что вы знаете, для чего нужны: {и:}, что я обнаружил только через 5 минут go при поиске для получения помощи по этой проблеме.)

Затем вы получите:

:{
let x = 3
    y = 4
in x + y
:}

Вы можете скопировать все 5 строк и вставить в GHCi, и это даст правильный результат 7.

Если вы попробуете то же самое с WinGHCI, вы получите ошибку: unknown command ':{', хотя это работает, если вы копируете и вставляете каждую из 5 строк отдельно ( вход в многострочный режим после :{)

Я также пробовал:

  • с использованием маркеров> вместо >>>. Теперь при этом сохраняется пространство перед y = 4, но вывод 7 становится обычным текстом, не связанным с кодом примера.
  • с использованием: set + m вместо: {and:}. Вы можете скопировать / вставить 3 строки в GHCi, но WinGHCi жалуется:

    <interactive>:71:17: error:
        parse error on input ‘=’
        Perhaps you need a 'let' in a 'do' block?
        e.g. 'let x = 5' instead of 'x = 5'
    

    хотя это работает, если вы копируете / вставляете строки отдельно (переходя в многострочный режим после первой).

...