Haskell Gnuplot не отвечает на функцию заголовка - PullRequest
4 голосов
/ 08 апреля 2020

Я пытаюсь добавить заголовок к сюжету, сделанному с помощью Gnuplot в Haskell. Хотя программа создает график в отдельном окне, которое она создает, я не могу заставить его реагировать на функцию заголовка. Я неправильно использую функцию заголовка?

Я использую Stack с

 - only "-gnuplot" added to the "dependencies:" section of package.yaml
 - resolver: lts-15.7 in an unmodified stack.yaml.

на компьютере под управлением Linux Mint 19. Код и снимок экрана всплывающего окна. вверх окна:

module Main where

import Graphics.Gnuplot.Advanced
import Graphics.Gnuplot.Plot.TwoDimensional as P2D
import Graphics.Gnuplot.Graph.TwoDimensional as G2D
import Graphics.Gnuplot.Terminal.X11 as X11

zeroToTen = [0.0, 0.1 .. 10.0 :: Double]

main :: IO ()
main = do
  plot (X11.title "My Title" X11.cons) (P2D.function G2D.lines zeroToTen sin)
  _  <- getLine
  return ()

screen shot of the pop-up window the program creates

1 Ответ

2 голосов
/ 09 апреля 2020

Это ошибка в gnuplot (пакет). Ниже приведен блок кода, в котором параметры терминала X11 встроены в gnuplot -разборные параметры командной строки:

Файл: X11.hs

-- Part of a record update, hence the trailing comma
Terminal.options =
     "x11" :
     catMaybes (
           (fmap quote $ title_ term) :
        (fmap (formatBool "persist") $ persist_ term) :
        []),

Третий последний в строке, поле title_ :: Maybe String записи term окружено кавычками с помощью функции quote (просто псевдоним show). Проблема в том, что для анализа gnuplot к нему также должен добавляться title ( см. Руководство ). Пока это не исправлено, вы всегда можете настроить gnuplot как локальный пакет и собрать его оттуда.

Вот исправление (строка 43 из X11.hs):

(fmap (("title " ++) . quote) $ title_ term) :

Working screenshot

Кстати, есть более оптимальный способ импорта пакетов. Запись import X as Y означает: «импортировать все в глобальное пространство имен, но также дать мне Y в качестве псевдонима для импортированных символов». Лучший способ - это import qualified X as Y, который ограждает импортированный модуль в пространство имен Y.

Последнее замечание Если вы попытаетесь собрать gnuplot самостоятельно, вы обнаружите, что gnuplot не компилируется из-за пары пропущенных Semigroup экземпляров, вызванных предложением "Полугруппа-моноид" в GH C 8.4. Чтобы исправить это, просто добавьте экземпляр Semigroup, который ссылается на метод mappend из экземпляра Monoid:

import Data.Semigroup
instance Semigroup Script where
  (<>) = mappend
...