Как установить хаскель на линукс
Я нашел это руководство с 2014 года и решил установить пакеты из репозитория Manjaro. Это работало нормально, пока я не хотел использовать haskell-mode в Emacs. Я решил эту проблему и обнаружил, что это была проблема с пакетами (в основном это стек).
Мои вопросы связаны с этим:
- Является ли это рекомендуемым начальным способом установки работающей Haskell (платформы) в Linux (Manjaro) в 2018 году? Если нет: как это сделать?
- Платформа Haskell содержит: GHC, Cabal, Stack и некоторые пакеты. GHC и Stack установлены, как мне установить Cabal через Stack?
- Нужна ли мне Cabal (кажется, стек имеет перекрывающуюся функциональность)?
- Глядя на пакеты платформы Haskell, чего мне не хватает при установке Stack, как описано выше? Ищу в $HOME/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.2.2/lib/ghc-8.2.2 многие из них уже установлены.
2 ответа
Вот (длинный) альтернативный ответ. Обратите внимание, что я тоже рекомендовал Stack для начинающих, но с тех пор я передумал.
TL; DR: либо Haskell Platform, либо чистая установка Stack могут предоставить вам все, что вам нужно, и вы не будете ничего "упускать", выбрав одну или другую. Вероятно, вам будет проще пропустить Stack и установить Haskell Platform с помощью "универсального" установщика Linux, поскольку он поставляется со всем необходимым, и установка будет более точно соответствовать описанной в книге LYAH. Вы можете установить Stack позже, когда будете заниматься более серьезной разработкой нескольких проектов. Если вы предпочитаете использовать чистую установку стека, я бы предложил начать с рабочего процесса "только для глобального проекта". В любом случае, вы можете использовать "haskell-mode" с некоторыми исправлениями конфигурации, предложенными ниже (включая ключевой параметр, который потребуется, если вы работаете в глобальном проекте установки только в стеке).
Вот длинный ответ.
Стек против Платформы против Кабала
Книга LYAH предшествует Stack, что, безусловно, является основной причиной, по которой она не упоминается. На haskell.org они рекомендуют использовать минимальный установщик, стек или платформу Haskell. Все три метода являются совершенно разумными в 2018 году для создания работающей среды Haskell. Они различаются как в способах, которые они выбирают для изоляции разных версий компилятора и / или библиотек в "песочницах" для разработки, так и в том, сколько они устанавливают изначально, но ни в одной из них не может быть "пропущено" ничего, что не может быть установленным по требованию. В зависимости от того, что вы выберете, в вашем рабочем процессе будут некоторые различия (см. Ниже).
И Stack, и Cabal являются комбинированными менеджерами пакетов и инструментами сборки. (У стека есть дополнительная возможность фактически загружать всю установку на Haskell, поэтому это также и сам метод установки.) Пока вы работаете через LYAH, вы на самом деле не будете использовать функциональность "инструмента сборки" напрямую. на ваших собственных проектах. (Встроенные средства сборки GHC более чем достаточны для создания небольших многомодульных проектов.) Вам просто потребуется функциональность менеджера пакетов для установки дополнительных библиотек.
Так как Stack и Cabal управляют своими пакетами отдельно, если вы используете Stack, вам не нужно будет использовать Cabal напрямую. Вы можете установить его, если хотите (и на самом деле, Stack использует Cabal для некоторых эзотерических функций, таких как "решение стека", и потребует его установки в этих случаях):
Но, несмотря на то, что это поместит "cabal" в "$HOME/.local/bin" (и вы захотите убедиться, что это на вашем пути), вы обнаружите, что вам нужно прыгать через обручи, чтобы запустить его:
и это действительно не делает ничего полезного в том, что касается вашей среды стека.
Что не хватает со стеком
Я думаю, что это охватывает ваши первые три вопроса. И, наконец, главное, чего вам не хватает при установке Stack вместо платформы Haskell, так это того, что Stack на самом деле не устанавливает ничего в глобальном масштабе, кроме самого "стека". Итак, вся ваша работа на Haskell, включая запуск интерпретатора Haskell ("ghci") или компилятора ("ghc"), должна выполняться в среде Stack, либо с использованием определенной соответствующей команды Stack:
или же использовать "стек exec" для запуска универсальной программы в соответствующей среде стека. Например, иногда может быть полезно запустить оболочку Bash под стеком, после чего все будет вести себя как глобально установленная среда платформы Haskell:
и перезапустите ваш переводчик.
Рекомендация по использованию платформы Haskell
Поскольку Stack немного сложен, и вам не понадобятся средства, которые он предоставляет в начале, вам может оказаться, что платформу Haskell проще использовать, когда вы начинаете. ("Универсальный" установщик должен нормально работать в вашем дистрибутиве.) Он поставляется со всем установленным, и способ его использования будет более точно соответствовать описанным в LYAH. Вместе с haskell-mode , у вас должна быть довольно приличная среда на Хаскеле.
В общем, не должно быть проблем с установкой стека и платформы Haskell параллельно (о чем свидетельствует тот факт, что на платформе Haskell фактически имеется стек). Stack будет поддерживать все отдельно в подкаталоге "$HOME/.stack", поэтому не будет никаких помех между компиляторами, пакетами или чем-либо еще. Обратите внимание, что в этой настройке вы будете использовать cabal управлять пакетами, установленными на платформе, и stack - очевидно - для управления пакетами на стороне стека.
Начинающий рабочий процесс для установки в чистом стеке
Если вы хотите сохранить чистую установку стека, я мог бы предложить следующий рабочий процесс, когда вы начинаете:
Вы увидите ссылки на проекты Stack, созданные с помощью "stack new" или "stack init". Избегайте их в начале и придерживайтесь стека "глобальный проект". Это неявный проект, который будет действовать, когда вы запустите "стек" в каталоге, в котором нет файла "stack.yaml" (напрямую или в родительском каталоге):
Когда вы работаете в глобальном проекте (т.е. не где-то под stack.yaml файл), вы можете вызвать интерпретатор и компилятор с:
и они оба будут иметь доступ к любым дополнительным библиотекам (пакетам), которые вы установили, используя такие команды, как:
Обновлено: примечание о разнице между stack ghci а также stack exec ghci , Первый предназначен для запуска GHCi в контексте локального проекта (т.е. работает под stack.yaml файл). Он передает некоторые дополнительные флаги, чтобы скрыть глобально установленные пакеты и автоматически сделать модули доступными из вашего пакета. Работая в глобальном проекте, я не думаю, что есть какая-то практическая разница, кроме stack ghci генерирует предупреждение; и независимо от того, что вы используете, вам нужно явно загружать свои собственные модули с :load Whatever.hs , На этой странице документации стека есть немного больше информации о разнице, особенно в нижней части, где она пытается объяснить разницу.
В конце концов, вы можете переключиться на рабочий процесс, использующий проекты Stack. Это будет включать использование stack new создать новый каталог проекта стека, stack setup установить / связать частную версию компилятора в этот каталог, а затем изменить проект xxx.cabal файл (и, возможно, его stack.yaml файл), чтобы указать, какие дополнительные пакеты требуются, вместо использования stack install , Это все немного сложно, когда вы просто хотите начать писать код.
Вы также можете увидеть ссылку на Intero, режим Emacs, разработанный специально для стека. Intero очень хорош, но он не очень хорошо работает при работе с файлами в глобальном проекте. Он захочет запустить интерпретатор в каталоге "
/.stack/global-project", что довольно бесполезно. (Я использую Intero, но я исправил его, чтобы вести себя лучше в этом отношении.)
Настройка режима Haskell (для платформы или стека)
Возможно, вместо этого лучше придерживаться режима haskell-mode и думать о Intero, когда вы начинаете использовать неглобальные проекты. Я бы предложил установить "haskell-mode" из MELPA согласно инструкциям, но добавив следующее к вашему .emacs файл вместо того, что предлагается в документации:
Если вы решите использовать вместо этого платформу Haskell, я думаю, что вся эта конфигурация в "режиме Haskell" все равно будет применяться, за исключением того, что вы должны удалить самую последнюю строку настройки. (По умолчанию haskell-process-type из auto подберу что-нибудь подходящее.)
На настоящий момент установка и использование Haskell через утилиту stack является безусловно предпочтительным.
Некоторые могут возразить "да мне нужно то только несколько примеров решить, это, говорят, можно чём угодно". Вот именно что говорят. А на практике у вопрошающего что то не идёт. А большинство тех кто ему может ответить используют stack. Ну и вот. Денис Шевченко в свой книжке описывал установку и начало использования стека под MacOS. Я взял чистую Win 7 x32 (что было) и поставил stack. Историю этого действия с комментариями я и предлагаю почтеннейшей публики.
После запуска инсталятора он предложил установится в
C:\Users\User\AppData\Roaming\local\bin
Далее нужно выбрать каталог для своих экспериментов (а может и работы) на Haskell.
Я создал каталог c:\Users\User\Samples\Haskell Но вы можете создать любой другой.
Т.к. программы stack, компилятор и т.д. изначально линуксовые я воздерживаюсь от каталогов с именами содержащими пробелы и русские буквы.
И так, перейдя в c:\Users\User\Samples\Haskell я собираюсь создать проект.
Сразу же предвижу вопрос "А без проекта нельзя?", мне бы маленький файлик запустить.
Вообще то можно, но с проектом удобнее. В том числе с маленьким файликом.
Для проекта можно выбрать шаблон (шаблоны уже загружены по команде stack update и могут обновляться, так же как списки версий пакетов).
Интересно посмотреть список шаблонов:
stack templates
Из кратких комментариев к ним можно понять, что, по крайней мере для начала, большинство нам не понадобится. Многие шаблоны проектов предназначены для использования с конкретными пакетами или рассчитаны весьма на любителя. Однако, на этот список полезно иногда посматривать.
Для создания проекта можно просто опустить имя шаблона:
stack new имя-проекта
Каталог проекта окажется расположен в текущем подкаталоге.
Например, выполняем stack new tst1
C:\Users\User\Samples\Haskell>stack new tst1
Downloading template "new-template" to create project "tst1" in tst1\ .
The following parameters were needed by the template but not provided: author-em
ail, author-name, category, copyright, github-username
You can provide them in C:\sr\config.yaml, like this:
templates:
params:
author-email: value
author-name: value
category: value
copyright: value
github-username: value
Or you can pass each one as parameters like this:
stack new tst1 new-template -p "author-email:value" -p "author-name:value" -p "c
ategory:value" -p "copyright:value" -p "github-username:value"
Looking for .cabal or package.yaml files to use to init the project.
Using cabal packages:
- tst1\tst1.cabal
Selecting the best among 10 snapshots.
Downloaded lts-8.12 build plan.
Populated index cache.
* Matches lts-8.12
Selected resolver: lts-8.12
Initialising configuration using resolver: lts-8.12
Total number of user packages considered: 1
Writing configuration to file: tst1\stack.yaml
All done.
И так, посмотрим в каталог tst1. В нём окажутся подкаталоги app - с файлом Main.hs - основным файлом программы и ещё каталоги src для создания своей библиотеки, и каталог test - для написания тестов к библиотеке. Если вас такой проект устраивает - ок.
Если хочется, для начала чего поменьше, с одним исходным файлом, то вернёмся в каталог C:\Users\User\Samples\Haskell и выполним создание проекта с самым простым шаблоном:
stack new tst2 simple
Вот теперь действительно, создался один исходный файл в каталоге src.
В корне пректа находятся файлы
LICENSE
README.md - эти два файла нужны для документации. Файл лицензии и ридми. Подразумевается, что, если мы захотим это куда то выложить, то мы там напишем много всякого. Компилятору они не интересны, stack-у, пока, тоже.
Setup.hs - файл инсталяции нашего пакета, если мы его захотим инсталлировать. Они одинаковые почти для всех проектов, небольшие и просто не обращайте на него внимания.
tst2.cabal - файл описывающий проект. Он был главным в эпоху до stack-а. Сейчас он тоже нужен. Эта версия шаблона проекта подразумевает исключительно ручное редактирование этого файла. Туда можно дописать требуемые пакеты (и stack их загрузит), флаги компиляции и прочие настройки.
Теперь важное. stack использует разные настройки в зависимости от того, в каталоге проекта ли он запускается (там где файлы .cabal и .yaml) или нет. В каталогах проекта он учитывает к каким сборкам относятся проекты, и при запуске утилит, в том числе интерпретатора ghci и компилятора ghc, соответственно настраивает переменные окружения.
И так, посмотрим содержимое файла src\main.hs
- обычный "хелоуворд". Находясь в корне проекта соберём из него исполняемый файл.
Но вначале, загрузим собственно компилятор подходяший для сборки lts-8.12.
stack setup
Это не нужно делать каждый раз, для каждого проекта. То что уже загруженно stack-ом используется сообща всеми проектами.
После успешной загрузки компилятора (а с ним ставятся и всякие msys-ы), после инсталляции msys2 понадобится перезапустить консольное окно что бы прописанные переменные окружения вступили в силу.
Соберём, наконец, и наш "хеллоуворд" (Из каталога проекта!).
stack build
Как сообщает компилятор, исполняемый файл оказывается запрятан глубоко в подкаталоге .stack-work\dist\5f9bc736\build\tst2\tst2.exe
При чём, подкаталог .stack-work - это всякие результаты компиляции. Если что то пойдёт не так или захочется сменить сборку lts-8.12 на другую, каталог .stack-work можно смело удалить. Так же его не стоит архивировать и подобное.
Можно, конечно, запустить программу по указанному пути, но проще, опять же через stack:
Я нашел это руководство С 2014 года и решил установить пакеты из репозитория Manjaro. Это работало нормально, пока я не захотел использовать режим haskell в Emacs. Я устранил это и узнал, что это была проблема с пакетами (в основном стек).
мои вопросы связаны с этим:
- это рекомендуемый способ установки стартера функционирование Haskell (платформы) на Linux (Manjaro) в 2018 году? Если нет, то как это сделать?
- платформа Haskell содержит: GHC, Cabal, Stack и некоторые пакеты. GHC и стек установлены, как установить Cabal через стек?
- нужен ли мне Cabal (стек, похоже, имеет перекрывающуюся функциональность)?
- глядя на пакеты Платформа Haskell, что, если что-нибудь, мне не хватает, установив стек, как описано выше? Глядя в $HOME/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.2.2/lib/ghc-8.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", и потребует его установки в этих случаях):
но, хотя это поставит "Кабал" в " $ HOME/.local / bin "(и вы хотите убедиться, что это на вашем пути), вы обнаружите, что вам нужно прыгать через обручи, чтобы запустить его:
и это действительно не делает ничего полезного, насколько ваша среда стека обеспокоенный.
чего не хватает со стеком
я думаю, что это охватывает ваши первые три вопроса. Для вашего последнего, главное, что вам не хватает, установив Stack вместо платформы Haskell, заключается в том, что по дизайну Stack действительно не устанавливает ничего глобально, кроме "стек" сам по себе. Таким образом, вся ваша работа Haskell, включая запуск интерпретатора Haskell ("ghci") или компилятора ("ghc"), должна выполняться в среде стека либо с использованием конкретной соответствующей команды стека:
или с помощью "stack exec" для запуска общей программы в соответствующей среде стека. Например, иногда может быть полезно запустить оболочку Bash под стеком, после чего вещи ведут себя как глобально установленная платформа Haskell среды:
другое, что вам не хватает, это то, что платформа Haskell по умолчанию устанавливает целую кучу общих библиотек, в то время как новая среда стека начинается почти с ничего (даже компилятор, прежде чем запускать stack setup ). Во время работы через LYAH вам может потребоваться периодически устанавливать дополнительные библиотеки. Например, в вход и выход глава, примеры использования случайных чисел (блок System.Random ) потребует от вас для запуска:
и перезапустите интерпретатор.
рекомендация по использованию платформы Haskell
поскольку стек немного сложен, и вам не понадобятся средства, которые он предоставляет в начале, вы можете найти платформу Haskell проще в использовании, когда вы начинаете. (Установщик "Generic" должен отлично работать в вашем дистрибутиве.) Он поставляется со всем установленным, и способ его использования будет более точно соответствовать тому, как обстоят дела описан в Ляхе. Вместе с haskell-mode , у вас должна быть довольно приличная среда Haskell.
в общем, не должно быть никаких проблем со стеком и платформой Haskell, установленной бок о бок (о чем свидетельствует тот факт, что платформа Haskell на самом деле включает в себя стек). Стек будет поддерживать все отдельно под " $ HOME/.подкаталог "stack", поэтому не будет никаких помех между компиляторами или пакетами или чем-либо еще. Обратите внимание, что в этой настройке вы использовать cabal для управления пакетами, установленными на стороне платформы вещей, и stack -- очевидно -- для управления пакетами на стороне стека.
начинающий рабочий процесс для чистой установки стека
если вы хотите придерживаться чистой установки стека, я мог бы предложить следующий рабочий процесс, когда вы начинаете:
вы увидите ссылки на проекты стека, созданные с помощью "stack new"или" stack init". Избегайте их в начале и придерживайтесь со стеком "глобальный проект". Это неявный проект, который будет действовать при запуске " стека "в каталоге, который не имеет "стека".файл "yaml" (непосредственно или в Родительском каталоге):
когда вы работаете в глобальном проекте (т. е. не где-то под stack.yaml file), вы можете вызвать интерпретатор и компилятор с помощью:
и они оба будут иметь доступ к любым дополнительным библиотекам (пакетам), которые вы установили с помощью команд например:
обновление: примечание о разнице между 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 в соответствии с инструкциями, но добавив следующее к вашему что предлагается в документации:
если вы решите использовать платформу Haskell вместо этого, я думаю, что все это " Haskell-mode" конфигурация по-прежнему будет применяться, за исключением того, что вы должны удалить самую последнюю строку настройки. (Значение по умолчанию haskell-process-type of auto подберем что-нибудь подходящее.)
Я нашел это руководство 2014 года и решил установить пакеты из репозитория Манджаро. Это работало нормально, пока я не захотел использовать haskell-mode в Emacs. Я устранил это и обнаружил, что это проблема с пакетами (в основном, со стеком).
Мои вопросы связаны с этим:
- Это рекомендуемый стартовый способ установки работающего Haskell (Platform) в Linux (Manjaro) в 2018 году? Если нет: как это сделать?
- Платформа Haskell содержит: GHC, Cabal, Stack и некоторые пакеты. GHC и Stack установлены, как мне установить Cabal через Stack?
- Нужна ли мне Кабала (кажется, что у стека перекрывающиеся функции)?
- Глядя на пакеты платформы Haskell, что, если что-либо, мне не хватает при установке Стек как описано выше? При просмотре $HOME/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.2.2/lib/ghc-8.2.2 многие из них кажутся уже установленными.
2 ответа
Вот (длинный) альтернативный ответ. Обратите внимание, что я рекомендовал Stack и новичкам, но с тех пор передумал.
TL; DR: Платформа Haskell или установка в чистом виде Stack могут предоставить вам все необходимое, и вы ничего не «упустите», выбрав то или другое. Вероятно, вам будет проще пропустить Stack и установить Haskell Platform с помощью «Generic» установщика Linux, потому что он поставляется со всем, что вам нужно, и установка будет более точно соответствовать тому, что описано в книге LYAH. Вы можете установить Stack позже, когда будете заниматься более серьезной разработкой нескольких проектов. Если вы предпочитаете придерживаться чистой установки Stack, я бы посоветовал начать с рабочего процесса «только для глобального проекта». В любом случае вы можете использовать «haskell-mode» с некоторыми исправлениями конфигурации, предложенными ниже (включая ключевой параметр, который потребуется, если вы работаете в глобальном проекте установки только для стека).
Вот длинный ответ .
Стек против платформы против Кабала
И Stack, и Cabal - это комбинированные менеджеры пакетов и инструменты сборки. (У Stack есть дополнительная возможность фактически запускать всю установку Haskell, поэтому это также самостоятельный метод установки.) Пока вы работаете с LYAH, вы фактически не будете напрямую использовать функциональность «инструмента сборки» по вашим собственным проектам. (Встроенных средств сборки GHC более чем достаточно для создания небольших многомодульных проектов.) Вам просто понадобится функциональность диспетчера пакетов для установки дополнительных библиотек.
Поскольку Stack и Cabal управляют своими пакетами отдельно, если вы используете Stack, у вас нет особой необходимости использовать Cabal напрямую. Вы можете установить его, если хотите (и на самом деле, Stack использует Cabal для некоторых эзотерических функций, таких как «решатель стека», и в таких случаях требует его установки):
Но даже если это поместит "cabal" в "$ HOME / .local / bin" (и вы захотите убедиться, что это на вашем пути), вы обнаружите, что вам нужно перепрыгнуть через обручи, чтобы запустить его. :
И на самом деле он не делает ничего полезного для вашей среды стека.
Чего не хватает в стеке
Думаю, это охватывает ваши первые три вопроса. И последнее: главное, чего вам не хватает при установке Stack вместо Haskell Platform, - это то, что по замыслу Stack на самом деле не устанавливает ничего глобально, кроме самого «стека». Итак, вся ваша работа с Haskell, включая запуск интерпретатора Haskell («ghci») или компилятора («ghc»), должна выполняться в среде Stack, либо с помощью специальной соответствующей команды Stack:
Или же с помощью «stack exec» для запуска общей программы в соответствующей среде Stack. Например, иногда может быть полезно запустить оболочку Bash под стеком, после чего все будет вести себя как глобально установленная среда платформы Haskell:
Еще вам не хватает того, что платформа Haskell по умолчанию устанавливает целую кучу общих библиотек, в то время как новая среда Stack запускается почти с нуля (даже с компилятором, прежде чем вы запустите stack setup ). Во время работы с LYAH вам может понадобиться периодически устанавливать дополнительные библиотеки. Например, в главе Ввод и вывод примеры использования случайных чисел (модуль System.Random ) потребуют от вас запуска:
И перезапустите свой интерпретатор.
Рекомендация по использованию платформы Haskell
Поскольку Stack немного сложен, и вам действительно не понадобятся возможности, которые он предоставляет в начале, вы можете найти платформу Haskell более простой в использовании, когда только начинаете. («Универсальный» установщик должен нормально работать с вашим дистрибутивом.) Он поставляется со всем установленным, и способ его использования будет более точно соответствовать тому, как все описано в LYAH. Вместе с haskell-mode у вас должна быть довольно приличная среда Haskell.
В общем, не должно возникнуть проблем с установкой Stack и Haskell Platform бок о бок (о чем свидетельствует тот факт, что Haskell Platform фактически включает Stack). Stack будет поддерживать все отдельно в подкаталоге «$ HOME / .stack», поэтому не будет никаких помех между компиляторами, пакетами или чем-либо еще. Обратите внимание, что в этой настройке вы будете использовать cabal для управления пакетами, установленными на стороне платформы, и stack - очевидно, - для управления пакетами на стороне стека.
Рабочий процесс для начинающих по установке Pure Stack
Если вы хотите придерживаться чистой установки Stack, я могу предложить следующий рабочий процесс, когда вы только начинаете:
Вы увидите ссылки на проекты Stack, созданные с помощью "stack new" или "stack init". Избегайте этого в начале и придерживайтесь стека «глобальный проект». Это неявный проект, который будет действовать, когда вы запустите "stack" в каталоге, в котором нет файла "stack.yaml" (непосредственно или в родительском каталоге):
Когда вы работаете в глобальном проекте (т.е. не где-нибудь в файле stack.yaml ), вы можете вызвать интерпретатор и компилятор с помощью:
И они оба будут иметь доступ к любым дополнительным библиотекам (пакетам), которые вы установили с помощью таких команд, как:
Обновлено: примечание о разнице между stack ghci и stack exec ghci . Первый предназначен для запуска GHCi в контексте локального проекта (т. Е. Для работы с файлом stack.yaml ). Он передает некоторые дополнительные флаги, чтобы скрыть глобально установленные пакеты и автоматически сделать доступными модули из вашего пакета. При работе в глобальном проекте я не думаю, что есть какая-то практическая разница, кроме того, что stack ghci выдает предупреждение; и независимо от того, какой вы используете, вам нужно будет явно загрузить свои собственные модули с помощью :load Whatever.hs . На этой странице документации по стеку есть немного дополнительной информации, особенно внизу. где он пытается объяснить разницу.
В конце концов, вы можете переключиться на рабочий процесс, в котором используются проекты Stack. Это будет включать использование stack new для создания нового каталога проекта Stack, stack setup для установки / связывания частной версии компилятора в этот каталог, а затем изменение файла проекта xxx.cabal (и, возможно, его < > файл), чтобы указать, какие дополнительные пакеты требуются, вместо использования stack install . Все это немного сложно, когда вы просто хотите начать писать код.
Вы также можете увидеть ссылку на Intero, режим Emacs, разработанный специально для Stack. Intero очень хорош, но не очень хорошо работает при работе с файлами в глобальном проекте. Он будет иметь тенденцию запускать интерпретатор в каталоге "
/ .stack / global-project", что довольно бесполезно. (Я использую Intero, но я пропатчил его, чтобы в этом отношении было лучше.)
Настройка режима Haskell (для платформы или стека)
Вероятно, лучше вместо этого придерживаться "haskell-mode" и думать об Intero, когда вы начнете использовать неглобальные проекты. Я бы предложил установить "haskell-mode" из MELPA в соответствии с инструкциями, но добавив в файл .emacs следующее вместо того, что предлагается в документации:
Если вы решите использовать вместо этого платформу Haskell, я думаю, что вся эта конфигурация "haskell-mode" по-прежнему будет применяться, за исключением того, что вам следует удалить самую последнюю строку настройки. (По умолчанию haskell-process-type из auto выберет что-нибудь подходящее.)
Надеюсь, это поможет!
У вас есть три варианта.
Платформа Haskell
Это возможность, но не популярный выбор по многим причинам, которые вы обнаружите в свое время, если решите пойти этим путем. У вас будет гораздо лучший опыт и намного поддержка со Stack или Nix. Что из этих двух людей использует, в основном зависит от личных предпочтений. Это разные звери, но для новичка различия не будут очевидны сразу, поэтому мало надежды на то, что вы сможете принять «осознанное решение». Просто выберите один и пересмотрите позже.
Это то, что я бы посоветовал всем (не знакомым с Nix), желающим быстро начать работу с Haskell. Период. Вам не нужно ничего устанавливать отдельно, Stack сделает все за вас. Обычно вы никогда не используете Cabal напрямую со Stack. stack build внутренне использует клику, но вам не о чем беспокоиться. Следует отметить, что Stack не является менеджером пакетов. Это инструмент для сборки. Обычно он ничего не устанавливает . Однако он извлекает все необходимые зависимости и сохраняет их в
/.stack вместе с другими вещами.
Шухер
Это то, что я использую лично, поэтому я могу быть предвзятым, но я думаю, что это лучшее решение в долгосрочной перспективе. Предостережение заключается в том, что кривая обучения довольно крутая, и у вас есть много шансов выстрелить себе в ногу, когда вы начинаете.
Я настоятельно рекомендую начать со Stack, но не забывайте о Nix, пока ваше путешествие с Haskell продолжается.
Читайте также: