Как установить Haskell (платформа или стек) в 2018 году на Linux?

Я пытаюсь узнать Haskell из книги узнать вы на Haskell Мирана Lipovača. И книга, и haskell.org рекомендует установить Платформа Haskell но нет загрузки для Manjaro Linux (Arch based), который я использую.

Я нашел это руководство С 2014 года и решил установить пакеты из репозитория Manjaro. Это работало нормально, пока я не захотел использовать режим haskell в Emacs. Я устранил это и узнал, что это была проблема с пакетами (в основном стек).

В поисках способов исправить это я нашел это Reddit thread, в котором описаны способы установки Haskell (а не Платформы) и проблемы с пакетами. Я последовал за одним из комментариев и закончил установку стека (и GHC) со сценарием, как описано здесь:

wget -qO- https://get.haskellstack.org/ | sh
stack setup
stack update

мои вопросы связаны с этим:

  1. это рекомендуемый способ установки стартера функционирование Haskell (платформы) на Linux (Manjaro) в 2018 году? Если нет, то как это сделать?
  2. платформа Haskell содержит: GHC, Cabal, Stack и некоторые пакеты. GHC и стек установлены, как установить Cabal через стек?
  3. нужен ли мне Cabal (стек, похоже, имеет перекрывающуюся функциональность)?
  4. глядя на пакеты Платформа Haskell, что, если что-нибудь, мне не хватает, установив стек, как описано выше? Глядя в $HOME/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.2.2/lib/ghc-8.2.2 многие из них, кажется, уже установлены.

2 ответов


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

TL; DR: либо платформа Haskell, либо чистая установка стека может предоставить вам все, что вам нужно, и вы не будете "пропускать" ничего, выбирая тот или иной. Вероятно, вам будет проще пропустить стек и установить платформу Haskell с помощью" универсального " установщика Linux, потому что он поставляется со всем необходимым и настройка будет более точно соответствовать тому, что описано в книге Ляха. Вы можете установить стек позже, когда вы делаете более серьезную разработку для нескольких проектов. Если вы предпочитаете придерживаться чистой установки стека, я бы предложил начать с рабочего процесса "только глобальный проект". В любом случае, вы можете использовать "Haskell-mode" с некоторыми исправлениями конфигурации, предложенными ниже (включая настройку ключа, которая потребуется, если вы работаете в глобальном проекте только стека установка.)

вот длинный ответ...

стек против платформы против Кабал

стопка предварительных дат книги LYAH, которая, безусловно, является основной причиной, по которой она не упоминает об этом. На haskell.org, они рекомендуют использовать либо минимальный установщик, стек или платформу Haskell. Все три метода являются вполне разумными способами в 2018 году создать рабочую среду Haskell. Они отличаются и в путях они выбирают изолировать различные версии компилятор и / или библиотеки в "песочницы" для разработки работают, и в сколько они устанавливают изначально, но нет ничего "отсутствующего" от любого из них, что не может быть установлено по требованию. В зависимости от того, что вы выберете, в вашем рабочем процессе будут некоторые различия (см. ниже).

оба стека и Cabal являются комбинированными менеджерами пакетов и инструментами сборки. (Стек имеет дополнительную возможность фактически загружать всю установку Haskell, поэтому он также является способ установки сам по себе.) Пока вы работаете через LYAH, вы фактически не будете использовать функциональность "build tool" непосредственно в своих собственных проектах. (Встроенные средства сборки GHC более чем достаточны для строительства небольших, многомодульных проектов.) Вам просто нужна функция пакетного менеджера для установки дополнительных библиотек.

поскольку Stack и Cabal управляют своими пакетами отдельно, если вы используете Stack, у вас не будет особой необходимости использовать Cabal непосредственно. Вы можете установить его, если хотите (и на самом деле, Stack использует Cabal для некоторых эзотерических функций, таких как "Stack solver", и потребует его установки в этих случаях):

$ stack install cabal-install

но, хотя это поставит "Кабал" в " $ HOME/.local / bin "(и вы хотите убедиться, что это на вашем пути), вы обнаружите, что вам нужно прыгать через обручи, чтобы запустить его:

$ stack exec --no-ghc-package-path cabal -- list

и это действительно не делает ничего полезного, насколько ваша среда стека обеспокоенный.

обновление: заметка о " $ HOME/.местные/Бен" путь. Это похоже на сценарий установки изhttps://get.haskellstack.org/ может установить сам стек в /usr/local/bin/stack по умолчанию, если нет существующей установки. Однако он должен отображать предупреждение put $HOME/.local/bin на вашем пути. Если вы обновите стек в будущем с помощью stack upgrade, он установит новую версию stack там, в этой папке также будет использоваться, если вы установите пакеты, включающие двоичные файлы. Например, stack install hlint установит программу Haskell Lint hlint в этот каталог. Итак, это хорошая идея, чтобы иметь его на своем пути и где-то до /usr/local/bin.

чего не хватает со стеком

я думаю, что это охватывает ваши первые три вопроса. Для вашего последнего, главное, что вам не хватает, установив Stack вместо платформы Haskell, заключается в том, что по дизайну Stack действительно не устанавливает ничего глобально, кроме "стек" сам по себе. Таким образом, вся ваша работа Haskell, включая запуск интерпретатора Haskell ("ghci") или компилятора ("ghc"), должна выполняться в среде стека либо с использованием конкретной соответствующей команды стека:

$ echo 'main = putStrLn "Hello, world!"' > Hello.hs
$ stack ghc -- Hello.hs
[1 of 1] Compiling Main             ( Hello.hs, Hello.o )
Linking Hello ...
$ ./Hello 
Hello, world!
$ 

или с помощью "stack exec" для запуска общей программы в соответствующей среде стека. Например, иногда может быть полезно запустить оболочку Bash под стеком, после чего вещи ведут себя как глобально установленная платформа Haskell среды:

$ stack exec bash
$ ghci
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
Prelude> :quit
$ ghc -O2 Hello.hs
[1 of 1] Compiling Main             ( Hello.hs, Hello.o ) [flags changed]
Linking Hello ...
$ exit
$ ghc
The program 'ghc' is currently not installed. ...
$

другое, что вам не хватает, это то, что платформа Haskell по умолчанию устанавливает целую кучу общих библиотек, в то время как новая среда стека начинается почти с ничего (даже компилятор, прежде чем запускать stack setup). Во время работы через LYAH вам может потребоваться периодически устанавливать дополнительные библиотеки. Например, в вход и выход глава, примеры использования случайных чисел (блок System.Random) потребует от вас для запуска:

$ stack install random

и перезапустите интерпретатор.

рекомендация по использованию платформы Haskell

поскольку стек немного сложен, и вам не понадобятся средства, которые он предоставляет в начале, вы можете найти платформу Haskell проще в использовании, когда вы начинаете. (Установщик "Generic" должен отлично работать в вашем дистрибутиве.) Он поставляется со всем установленным, и способ его использования будет более точно соответствовать тому, как обстоят дела описан в Ляхе. Вместе с haskell-mode, у вас должна быть довольно приличная среда Haskell.

в общем, не должно быть никаких проблем со стеком и платформой Haskell, установленной бок о бок (о чем свидетельствует тот факт, что платформа Haskell на самом деле включает в себя стек). Стек будет поддерживать все отдельно под " $ HOME/.подкаталог "stack", поэтому не будет никаких помех между компиляторами или пакетами или чем-либо еще. Обратите внимание, что в этой настройке вы использовать cabal для управления пакетами, установленными на стороне платформы вещей, и stack -- очевидно -- для управления пакетами на стороне стека.

начинающий рабочий процесс для чистой установки стека

если вы хотите придерживаться чистой установки стека, я мог бы предложить следующий рабочий процесс, когда вы начинаете:

вы увидите ссылки на проекты стека, созданные с помощью "stack new"или" stack init". Избегайте их в начале и придерживайтесь со стеком "глобальный проект". Это неявный проект, который будет действовать при запуске " стека "в каталоге, который не имеет "стека".файл "yaml" (непосредственно или в Родительском каталоге):

$ cd
$ stack path --project-root
/u/buhr/.stack/global-project
$

когда вы работаете в глобальном проекте (т. е. не где-то под stack.yaml file), вы можете вызвать интерпретатор и компилятор с помощью:

$ stack exec ghci
$ stack ghc -- -O2 Hello.hs

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

$ stack install random

обновление: примечание о разнице между stack ghci и stack exec ghci. Первый предназначен для запуска GHCi в контексте локального проекта (т. е. работает под ). Он передает некоторые дополнительные флаги, чтобы скрыть глобально установленные пакеты и автоматически сделать модулей из пакета. При работе в глобальном проекте я не думаю, что есть какая-либо практическая разница, кроме этого stack ghci генерирует предупреждение; и независимо от того, что вы используете, вам нужно будет загрузить свои собственные модули явно с помощью :load Whatever.hs. Есть немного больше информации о разнице на эта страница документации стека, особенно внизу, где он пытается объяснить разницу.

в конце концов, вы можете переключиться на рабочий процесс, который использует проекты стека. Это будет включать использование stack new чтобы создать новый каталог проекта стека,stack setup для установки / ссылки частной версии компилятора в этот каталог и затем изменение проекта xxx.cabal файл (и, возможно, его stack.yaml file), чтобы указать, какие дополнительные пакеты требуются, вместо использования stack install. Это все немного сложно, когда вы просто хотите начать писать код.

вы также можете увидеть ссылку на Intero, режим Emacs, разработанный специально для стека. Intero очень хороший, но он не очень хорошо работает при работе с файлами в глобальном проекте. Он, как правило, хочет запустить переводчик в справочник./~" stack / global-project", что довольно бесполезно. (Я использую Intero, но я исправил его, чтобы вести себя лучше в этом отношении.)

настройка Haskell-Mode (для платформы или стека)

вероятно, лучше всего придерживаться "Haskell-mode" вместо этого и думать о Intero, когда вы начинаете использовать не глобальные проекты. Я бы предложил установить" Haskell-mode " из MELPA в соответствии с инструкциями, но добавив следующее к вашему что предлагается в документации:

(require 'haskell)

;; add capability to submit code to interpreter and mark errors
(add-hook 'haskell-mode-hook 'interactive-haskell-mode)

;; add missing keybindings for navigating errors
(define-key interactive-haskell-mode-map (kbd "M-n") 'haskell-goto-next-error)
(define-key interactive-haskell-mode-map (kbd "M-p") 'haskell-goto-prev-error)
(define-key interactive-haskell-mode-map (kbd "C-c M-p") 
 'haskell-goto-first-error)

;; merge this with your existing custom-set-variables
(custom-set-variables

 ;; NOTE: include following line to work around haskell-mode
 ;; bug if using GHC >= 8.2.1.
 ;; See: https://github.com/haskell/haskell-mode/issues/1553
 '(haskell-process-args-stack-ghci 
   '("--ghci-options=-ferror-spans -fshow-loaded-modules"
     "--no-build" "--no-load"))

 ;; some options suggested in the haskell-mode documentation
 '(haskell-process-auto-import-loaded-modules t)
 '(haskell-process-log t)
 '(haskell-process-suggest-remove-import-lines t)

 ;; make sure "stack ghci" is used, even in the global project
 '(haskell-process-type 'stack-ghci))

я протестировал это с помощью чистой установки стека, используя "Haskell-mode-20171022.26", и, похоже, работает нормально. Я могу загрузить новый файл Haskell в глобальный проект, отправить его на интерактивный сеанс с "C-c C-l" и просмотреть выделенные ошибки в исходном файле с "M-n" и "M-p". (Ошибки отображаются в мини-буфере.)

если вы решите использовать платформу Haskell вместо этого, я думаю, что все это " Haskell-mode" конфигурация по-прежнему будет применяться, за исключением того, что вы должны удалить самую последнюю строку настройки. (Значение по умолчанию haskell-process-type of auto подберем что-нибудь подходящее.)

надеюсь, что это поможет!


у вас есть три варианта.

Платформа Haskell

это возможность, но не популярный выбор по многим причинам, которые вы обнаружите в свое время, если вы решите пойти этим путем. Вы будете иметь гораздо лучший опыт и получить много лучшая поддержка со стеком или Nix. Какой из этих двух людей использует, по-видимому, в основном о личных предпочтениях. Они разные звери, но для новичка различия не будут сразу очевидными, поэтому мало надежды на то, что вы сможете принять "обоснованное решение". Просто выбери одну и переоценивай позже.

стек

это то, что я бы предложил всем (не знакомым с Nix), желающим быстро начать работу с Haskell. Период. Вам не нужно отдельно ничего устанавливать, стек будет обрабатывать все вещи Haskell для вас. Обычно вы никогда не используете cabal напрямую со стеком. stack build использует cabal внутренне, но вам не нужно беспокоиться об этом. Одна вещь обратите внимание, что Stack не является менеджером пакетов. Это инструмент сборки. Это обычно не установить ничего. Однако он извлекает все зависимости, которые ему нужны, и сохраняет их в ~/.stack вместе с другими вещами.

Никс

это то, что я использую лично, поэтому я могу быть предвзятым, но я думаю, что это лучшее решение в целом в долгосрочной перспективе. Предостережение заключается в том, что существует довольно крутая кривая обучения, и вам дается много шансов застрелиться в ногу когда начинаешь.

я настоятельно рекомендую начать со стека, но держать открытый ум о Nix, как ваше путешествие с Haskell продолжается.