GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie installiere ich Haskell (Plattform oder Stack) im Jahr 2018 unter Linux?

Sie haben drei Möglichkeiten.

Haskell-Plattform

Es ist eine Möglichkeit, aber aus vielen Gründen keine beliebte Wahl, die Sie zu gegebener Zeit entdecken werden, wenn Sie sich für diesen Weg entscheiden. Sie werden eine viel bessere Erfahrung machen und viel bekommen bessere Unterstützung mit Stack oder Nix. Welche dieser beiden Personen verwendet wird, scheint hauptsächlich von persönlichen Vorlieben abzuhängen. Sie sind unterschiedliche Tiere, aber für einen Anfänger werden die Unterschiede nicht sofort offensichtlich sein, also gibt es wenig Hoffnung, dass Sie in der Lage sein werden, eine "informierte Entscheidung" zu treffen. Wählen Sie einfach eine aus und bewerten Sie sie später erneut.

Stapeln

Dies ist, was ich jedem vorschlagen würde (der mit Nix nicht vertraut ist), der schnell mit Haskell beginnen möchte. Zeitraum. Sie müssen nichts separat installieren, Stack erledigt alle Haskell-Sachen für Sie. Normalerweise verwenden Sie Kabale nie direkt mit Stack. stack build verwendet Cabal intern, aber Sie brauchen sich darüber keine Gedanken zu machen. Beachten Sie, dass Stack kein Paketmanager ist. Es ist ein Build-Tool. Es wird normalerweise nicht installiert irgendetwas. Es ruft jedoch alle benötigten Abhängigkeiten ab und speichert sie in ~/.stack zusammen mit anderen Dingen.

Nichts

Dies ist, was ich persönlich benutze, also bin ich vielleicht voreingenommen, aber ich denke, dass dies auf lange Sicht insgesamt die beste Lösung ist. Die Einschränkung ist, dass es eine ziemlich steile Lernkurve gibt und Sie viele Chancen haben, sich am Anfang selbst ins Knie zu schießen.

Ich empfehle dringend, mit Stack zu beginnen, aber aufgeschlossen gegenüber Nix zu bleiben, während Ihre Reise mit Haskell weitergeht.


Hier ist eine (lange) alternative Antwort. Beachten Sie, dass ich Stack früher auch Anfängern empfohlen habe, aber seitdem habe ich meine Meinung geändert.

TL;DR: Sowohl die Haskell-Plattform als auch eine reine Stack-Installation können Ihnen alles bieten, was Sie brauchen, und Sie werden nichts „vermissen“, wenn Sie sich für das eine oder andere entscheiden. Sie werden es wahrscheinlich am einfachsten finden, Stack zu überspringen und die Haskell-Plattform mit dem "generischen" Linux-Installationsprogramm zu installieren, da es mit allem geliefert wird, was Sie brauchen, und das Setup eher dem entspricht, was im LYAH-Buch beschrieben ist. Sie können Stack später installieren, wenn Sie ernsthaftere Entwicklungsarbeiten an mehreren Projekten durchführen. Wenn Sie es vorziehen, bei einer reinen Stack-Installation zu bleiben, würde ich vorschlagen, mit einem „nur globalen Projekt“-Workflow zu beginnen. In jedem Fall können Sie den "haskell-mode" mit einigen unten vorgeschlagenen Konfigurationskorrekturen verwenden (einschließlich einer Schlüsseleinstellung, die erforderlich ist, wenn Sie im globalen Projekt einer Nur-Stack-Installation arbeiten).

Hier ist die lange Antwort...

Stack vs. Plattform vs. Cabal

Das LYAH-Buch ist älter als Stack, was sicherlich der Hauptgrund dafür ist, dass es nicht erwähnt wird. Auf haskell.org wird empfohlen, entweder ein minimales Installationsprogramm, Stack, oder die Haskell-Plattform zu verwenden. Alle drei Methoden sind im Jahr 2018 durchaus sinnvolle Möglichkeiten, um eine funktionierende Haskell-Umgebung einzurichten. Sie unterscheiden sich sowohl in der Art und Weise, wie sie verschiedene Versionen des Compilers und/oder der Bibliotheken in "Sandboxes" für die Entwicklungsarbeit isolieren, als auch darin, wie viel sie anfänglich installieren , aber bei keinem von ihnen "fehlt" etwas, was nicht bei Bedarf installiert werden kann. Je nachdem, wofür Sie sich entscheiden, gibt es einige Unterschiede in Ihrem Arbeitsablauf (siehe unten).

Sowohl Stack als auch Cabal sind kombinierte Paketmanager und Build-Tools. (Stack hat die zusätzliche Fähigkeit, tatsächlich eine gesamte Haskell-Installation zu booten, weshalb es auch eine eigenständige Installationsmethode ist.) Während Sie LYAH durcharbeiten, werden Sie die „Build-Tool“-Funktionalität nicht direkt verwenden an eigenen Projekten. (Die integrierten Build-Funktionen von GHC sind mehr als ausreichend, um kleine Projekte mit mehreren Modulen zu erstellen.) Sie benötigen lediglich die Paketmanager-Funktionalität, um zusätzliche Bibliotheken zu installieren.

Da Stack und Cabal ihre Pakete separat verwalten, müssen Sie Cabal nicht direkt verwenden, wenn Sie Stack verwenden. Sie können es installieren, wenn Sie möchten (und tatsächlich verwendet Stack Cabal für einige esoterische Funktionen, wie "Stack Solver", und erfordert in diesen Fällen, dass es installiert wird):

$ stack install cabal-install

Aber obwohl dies „cabal“ in „$HOME/.local/bin“ setzt (und Sie sollten sicherstellen, dass dies in Ihrem Pfad ist), werden Sie feststellen, dass Sie durch Reifen springen müssen, um es auszuführen :

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

und es macht nicht wirklich etwas Nützliches, was Ihre Stack-Umgebung betrifft.

Aktualisierung: Eine Anmerkung zum Pfad "$HOME/.local/bin". Es sieht so aus, als ob das Installationsskript von https://get.haskellstack.org/ Stack selbst auf /usr/local/bin/stack installieren könnte standardmäßig, wenn keine Installation vorhanden ist. Es sollte jedoch eine Warnung angezeigt werden, $HOME/.local/bin einzugeben auf deinem Weg. Wenn Sie Stack in Zukunft mit stack upgrade aktualisieren , wird die neue Version von stack installiert dort, und dieses Verzeichnis wird auch verwendet, wenn Sie Pakete installieren, die Binärdateien enthalten. Beispiel:stack install hlint installiert das Haskell Lint-Programm hlint zu diesem Verzeichnis. Es ist also eine gute Idee, es in Ihrem Pfad und irgendwo vor /usr/local/bin zu haben .

Was bei Stack fehlt

Ich denke, das deckt Ihre ersten drei Fragen ab. Zum Schluss ist das Wichtigste, was Sie vermissen, wenn Sie Stack anstelle der Haskell-Plattform installiert haben, dass Stack von Natur aus nicht wirklich etwas anderes als "Stack" selbst installiert. Daher müssen alle Ihre Haskell-Arbeiten, einschließlich der Ausführung des Haskell-Interpreters ("ghci") oder Compilers ("ghc"), innerhalb einer Stack-Umgebung ausgeführt werden, entweder mit einem bestimmten entsprechenden Stack-Befehl:

$ 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!
$ 

oder verwenden Sie "stack exec", um ein generisches Programm in einer geeigneten Stack-Umgebung auszuführen. Beispielsweise kann es manchmal hilfreich sein, eine Bash-Shell unter Stack auszuführen, wonach sich die Dinge wie eine global installierte Haskell-Plattformumgebung verhalten:

$ 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. ...
$

Die andere Sache, die Sie vermissen, ist, dass die Haskell-Plattform standardmäßig eine ganze Reihe gängiger Bibliotheken installiert, während eine frische Stack-Umgebung mit fast nichts beginnt (nicht einmal mit dem Compiler, bevor Sie stack setup ausführen ). Während Sie LYAH durcharbeiten, stellen Sie möglicherweise fest, dass Sie regelmäßig zusätzliche Bibliotheken installieren müssen. Zum Beispiel in der Eingabe und Ausgabe Kapitel, die Beispiele mit Zufallszahlen (Modul System.Random ) müssen Sie Folgendes ausführen:

$ stack install random

und starten Sie Ihren Interpreter neu.

Empfehlung zur Verwendung der Haskell-Plattform

Da Stack ein wenig kompliziert ist und Sie die Funktionen, die es zu Beginn bietet, nicht wirklich benötigen, finden Sie die Haskell-Plattform möglicherweise einfacher zu verwenden, wenn Sie anfangen. (Das "Generic"-Installationsprogramm sollte auf Ihrer Distribution gut funktionieren.) Es wird mit allem, was installiert ist, geliefert, und die Art und Weise, wie Sie es verwenden, entspricht eher der Art und Weise, wie die Dinge in LYAH beschrieben sind. Zusammen mit haskell-mode , sollten Sie eine ziemlich anständige Haskell-Umgebung haben.

Im Allgemeinen sollte es kein Problem geben, Stack und die Haskell-Plattform nebeneinander zu installieren (wie die Tatsache zeigt, dass die Haskell-Plattform tatsächlich enthält Stapel). Stack verwaltet alles separat im Unterverzeichnis "$HOME/.stack", sodass es keine Interferenzen zwischen Compilern oder Paketen oder irgendetwas gibt. Beachten Sie, dass Sie in diesem Setup cabal verwenden um die auf der Plattformseite installierten Pakete zu verwalten, und stack -- offensichtlich -- um Pakete auf der Stack-Seite zu verwalten.

Einsteiger-Workflow für eine reine Stack-Installation

Wenn Sie bei Ihrer reinen Stack-Installation bleiben möchten, schlage ich für den Anfang vielleicht den folgenden Arbeitsablauf vor:

Sie sehen Verweise auf Stack-Projekte, die mit „stack new“ oder „stack init“ erstellt wurden. Vermeiden Sie diese am Anfang und bleiben Sie beim Stack "Global Project". Dies ist das implizite Projekt, das wirksam wird, wenn Sie „stack“ in einem Verzeichnis ausführen, das keine „stack.yaml“-Datei hat (direkt oder in einem übergeordneten Verzeichnis):

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

Wenn Sie im globalen Projekt arbeiten (also nicht irgendwo unter einem stack.yaml Datei), können Sie den Interpreter und Compiler aufrufen mit:

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

und sie haben beide Zugriff auf alle zusätzlichen Bibliotheken (Pakete), die Sie mit Befehlen wie:

installiert haben
$ stack install random

Aktualisiert: Eine Anmerkung zum Unterschied zwischen stack ghci und stack exec ghci . Ersteres soll GHCi im Rahmen eines lokalen Projekts ausführen (d. h. unter einem stack.yaml arbeiten Datei). Es übergibt einige zusätzliche Flags, um global installierte Pakete zu verbergen und automatisch Module aus Ihrem Paket verfügbar zu machen. Wenn ich im globalen Projekt arbeite, glaube ich nicht, dass es einen praktischen Unterschied gibt, außer dass stack ghci erzeugt eine Warnung; und egal welches Sie verwenden, Sie müssen Ihre eigenen Module explizit mit :load Whatever.hs laden . Auf dieser Stack-Dokumentationsseite finden Sie ein wenig mehr Informationen zu den Unterschieden, insbesondere unten, wo versucht wird, den Unterschied zu erklären.

Schließlich können Sie zu einem Workflow wechseln, der Stack-Projekte verwendet. Dazu wird stack new verwendet um ein neues Stack-Projektverzeichnis zu erstellen, stack setup eine private Compiler-Version in dieses Verzeichnis zu installieren/linken und dann den xxx.cabal des Projekts zu ändern Datei (und möglicherweise deren stack.yaml Datei), um anzugeben, welche zusätzlichen Pakete erforderlich sind, anstatt stack install zu verwenden . Es ist alles etwas kompliziert, wenn Sie nur mit dem Schreiben von Code beginnen möchten.

Möglicherweise sehen Sie auch Verweise auf Intero, einen Emacs-Modus, der speziell für Stack entwickelt wurde. Intero ist sehr nett, aber es funktioniert nicht sehr gut, wenn man an Dateien im globalen Projekt arbeitet. Es wird dazu neigen, den Interpreter im Verzeichnis "~/.stack/global-project" starten zu wollen, was ziemlich nutzlos ist. (Ich benutze Intero, aber ich habe es gepatcht, um sich in dieser Hinsicht besser zu verhalten.)

Konfigurieren des Haskell-Modus (für Plattform oder Stack)

Es ist wahrscheinlich am besten, stattdessen beim "Haskell-Modus" zu bleiben und an Intero zu denken, wenn Sie anfangen, nicht-globale Projekte zu verwenden. Ich würde vorschlagen, "haskell-mode" von MELPA gemäß den Anweisungen zu installieren, aber Folgendes zu Ihrem .emacs hinzuzufügen Datei anstelle dessen, was in der Dokumentation vorgeschlagen wird:

(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))

Ich habe dies mit einer reinen Stack-Installation mit "haskell-mode-20171022.26" getestet und es scheint gut zu funktionieren. Ich kann eine neue Haskell-Datei in das globale Projekt laden, sie zu einer interaktiven Sitzung mit "C-c C-l" senden und hervorgehobene Fehler in der Quelldatei mit "M-n" und "M-p" durchsuchen. (Die Fehler erscheinen im Minipuffer.)

Wenn Sie sich stattdessen für die Verwendung der Haskell-Plattform entscheiden, denke ich, dass die gesamte Konfiguration des „Haskell-Modus“ weiterhin gilt, außer dass Sie die allerletzte Anpassungszeile entfernen sollten. (Der Standardwert haskell-process-type von auto wird etwas Passendes auswählen.)

Hoffe das hilft!


Linux
  1. So installieren Sie Python unter Linux

  2. So installieren Sie Java unter Linux

  3. So installieren Sie NodeJS unter Linux

  4. So installieren Sie FFmpeg unter Linux

  5. So installieren Sie Vagrant unter Linux

So installieren Sie Bashtop unter Linux

So installieren Sie Helm unter Linux

So installieren Sie PuTTY unter Linux

So installieren Sie Diskonaut unter Linux

So installieren Sie LAMP Stack auf Rocky Linux 8

So installieren Sie LAMP Stack auf Oracle Linux 8