GNU/Linux >> Linux の 問題 >  >> Linux

Linux で 2018 に Haskell (プラットフォームまたはスタック) をインストールする方法は?

3 つの選択肢があります。

Haskell プラットフォーム

可能性はありますが、この方法を選択した場合、やがて発見される多くの理由から、人気のある選択肢ではありません。はるかに優れたエクスペリエンスが得られ、多く得られます Stack または Nix のサポートが向上します。この二人のどちらを使うかは、個人の好みによるところが大きいようです。それらは異なる獣ですが、初心者にとって違いはすぐには明らかではないため、「十分な情報に基づいた決定」を下すことができるという希望はほとんどありません. 1 つ選んで後で再評価してください。

スタック

これは、Haskell をすぐに使い始めたい (Nix に慣れていない) 人に提案するものです。限目。個別に何もインストールする必要はありません。Stack がすべての Haskell を処理します。通常、Stack で cabal を直接使用することはありません。 stack build は内部的に cabal を使用しますが、それについて心配する必要はありません。注意すべきことの 1 つは、Stack はパッケージ マネージャーではありません。ビルドツールです。通常はインストールしません なんでも。ただし、必要なすべての依存関係を取得し、それらを ~/.stack に格納します。 他のものと一緒に。

ニックス

これは私が個人的に使用しているものなので偏見があるかもしれませんが、長期的にはこれが全体的に最良の解決策だと思います.注意点は、かなり急な学習曲線があり、開始時に自分の足を撃つ可能性がたくさんあるということです.

Stack から始めることを強くお勧めしますが、Haskell の旅が続くにつれて、Nix についてはオープンな心を持つようにしてください。


これが(長い)代替の答えです。以前は初心者にも Stack を勧めていましたが、気が変わってしまいました。

TL;DR: Haskell プラットフォームまたは純粋なスタック インストールのいずれかで、必要なものがすべて提供され、どちらを選択しても「不足」することはありません。 Stack をスキップして、"Generic" Linux インストーラーを使用して Haskell Platform をインストールするのがおそらく最も簡単であることがわかるでしょう。これには、必要なものがすべて付属しており、セットアップが LYAH の本で説明されている内容とより厳密に一致するためです。複数のプロジェクトでより本格的な開発を行っている場合は、後で Stack をインストールできます。純粋な Stack インストールに固執する場合は、「グローバル プロジェクトのみ」のワークフローから始めることをお勧めします。どちらの方法でも、以下に提案されているいくつかの構成修正で「haskell-mode」を使用できます (スタックのみのインストールのグローバル プロジェクトで作業している場合に必要となるキー設定を含む)。

これが長い答えです...

スタック vs. プラットフォーム vs. カバル

LYAH の本は Stack より前の日付であり、それが Stack について言及していない主な理由であることは確かです。 haskell.org では、最小限のインストーラー、Stack、または Haskell Platform のいずれかを使用することを推奨しています。 3 つの方法はすべて、2018 年に動作する Haskell 環境をセットアップするための完全に合理的な方法です。開発作業のためにさまざまなバージョンのコンパイラやライブラリを「サンドボックス」に分離する方法と、最初にインストールする量の両方が異なります。 、しかし、オンデマンドでインストールできないものはありません。どちらを選択するかによって、ワークフローにいくつかの違いがあります (以下を参照)。

Stack と Cabal はどちらも、パッケージ マネージャーとビルド ツールを組み合わせたものです。 (スタックには、Haskell インストール全体を実際にブートストラップする機能が追加されているため、それ自体がインストール方法でもあります。) LYAH を使用している間は、実際には「ビルド ツール」機能を直接使用することはありません。あなた自身のプロジェクトで。 (GHC の組み込みのビルド機能は、小規模なマルチモジュール プロジェクトをビルドするのに十分すぎるほどです。)追加のライブラリをインストールするには、パッケージ マネージャー機能が必要なだけです。

Stack と Cabal はパッケージを別々に管理しているため、Stack を使用している場合は、Cabal を直接使用する必要は特にありません。必要に応じてインストールできます (実際、Stack は「スタック ソルバー」などのいくつかの難解な機能に Cabal を使用しており、その場合はインストールが必要になります):

$ stack install cabal-install

しかし、これにより「cabal」が「$HOME/.local/bin」に配置されますが (これがパスにあることを確認する必要があります)、実行するにはフープをジャンプする必要があることがわかります。 :

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

スタック環境に関する限り、実際には何も役に立ちません。

更新: 「$HOME/.local/bin」パスに関するメモ。 https://get.haskellstack.org/ のインストール スクリプトが Stack 自体を /usr/local/bin/stack にインストールするようです。 既存のインストールがない場合、デフォルトで。ただし、 $HOME/.local/bin を入れると警告が表示されるはずです あなたの道で。 stack upgrade で将来 Stack をアップグレードする場合 、stack の新しいバージョンをインストールします バイナリを含むパッケージをインストールする場合も、そのディレクトリが使用されます。例:stack install hlint Haskell Lint プログラム hlint をインストールします そのディレクトリに。したがって、パス内の /usr/local/bin より前のどこかに配置することをお勧めします。 .

スタックに欠けているもの

これで最初の 3 つの質問はカバーできたと思います。最後に、Haskell Platform の代わりに Stack をインストールしたことで欠けている主な点は、設計上、Stack は「スタック」自体以外にグローバルに何もインストールしないということです。したがって、Haskell インタープリター ("ghci") またはコンパイラー ("ghc") の実行を含むすべての Haskell 作業は、対応する特定の Stack コマンドを使用して、すべて Stack 環境内で行う必要があります。

$ 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 Platform 環境のように動作することが役立つ場合があります。

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

あなたが見逃しているもう1つのことは、Haskellプラットフォームがデフォルトで共通ライブラリの全体をインストールするのに対し、新しいスタック環境はほとんど何もない状態で開始されることです( stack setup を実行する前に、コンパイラさえも) )。 LYAH を使用しているときに、追加のライブラリを定期的にインストールする必要があることに気付く場合があります。たとえば、入力と出力 章、乱数を使用した例 (モジュール System.Random ) を実行する必要があります:

$ stack install random

インタプリタを再起動してください。

Haskell プラットフォームの使用に関する推奨事項

Stack は少し複雑で、最初は Stack が提供する機能を実際には必要としないため、Haskell Platform を使い始めたばかりの頃は使いやすいかもしれません。 (「汎用」インストーラーは、お使いのディストリビューションで正常に動作するはずです。) すべてがインストールされた状態で提供されます。使用方法は、LYAH で説明されている方法とより密接に一致します。 haskell-modeと一緒に 、かなりまともな Haskell 環境が必要です。

一般に、Stack と Haskell Platform を並べてインストールしても問題はありません (Haskell Platform に実際に include 含まれていることからも明らかなように)。 スタック)。スタックは「$HOME/.stack」サブディレクトリの下にすべてを個別に保持するため、コンパイラやパッケージなどの間で干渉が発生することはありません。このセットアップでは、cabal を使用することに注意してください。 プラットフォーム側にインストールされたパッケージを管理するため、および stack -- 明らかに -- スタック側でパッケージを管理するため。

Pure Stack インストールの初心者向けワークフロー

純粋な Stack インストールを使い続けたい場合は、最初に次のワークフローをお勧めします:

「stack new」または「stack init」で作成された Stack プロジェクトへの参照が表示されます。最初はこれらを避け、スタックの「グローバル プロジェクト」に固執してください。これは、"stack.yaml" ファイルを持たないディレクトリ (直接または親ディレクトリ) で "stack" を実行するときに有効になる暗黙的なプロジェクトです:

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

グローバル プロジェクトで作業している場合 (つまり、stack.yaml の下のどこかではない場合) ファイル)、次の方法でインタープリターとコンパイラーを呼び出すことができます:

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

両方とも、次のようなコマンドを使用してインストールした追加のライブラリ (パッケージ) にアクセスできます。

$ stack install random

更新: stack ghci の違いに関する注意 と stack exec ghci .前者は、ローカル プロジェクトのコンテキスト内で GHCi を実行することを目的としています (つまり、stack.yaml の下で作業します)。 ファイル)。グローバルにインストールされたパッケージを非表示にし、パッケージからモジュールを自動的に使用可能にするために、いくつかの追加フラグを渡します。グローバル プロジェクトで作業する場合、stack ghci 以外は実質的な違いはないと思います。 警告を生成します。どちらを使用する場合でも、独自のモジュールを :load Whatever.hs で明示的にロードする必要があります .違いについては、このスタックのドキュメント ページに、特に違いを説明しようとしているページの下部にもう少し詳しい情報があります。

最終的には、Stack プロジェクトを使用するワークフローに切り替えることができます。これには stack new の使用が含まれます 新しい Stack プロジェクト ディレクトリ stack setup を作成するには プライベートコンパイラバージョンをそのディレクトリにインストール/リンクし、プロジェクトの xxx.cabal を変更します ファイル (およびおそらくその stack.yaml ファイル) を使用して、stack install を使用する代わりに、どの追加パッケージが必要かを示します。 .コードを書き始めたいだけの場合は、すべてが少し複雑です。

また、スタック専用に設計された Emacs モードである Intero への参照も表示される場合があります。 Intero は非常に優れていますが、グローバル プロジェクトでファイルを操作する場合はうまく機能しません。ディレクトリ「~/.stack/global-project」でインタープリターを起動したい傾向がありますが、これはかなり役に立ちません。 (私は Intero を使用していますが、この点でより適切に動作するようにパッチを適用しました。)

Haskell-Mode の構成 (プラットフォームまたはスタック用)

代わりに「haskell-mode」に固執し、非グローバル プロジェクトを使い始めるときは Intero について考えるのがおそらく最善です。指示に従ってMELPAから「haskell-mode」をインストールすることをお勧めしますが、 .emacs に次を追加します ドキュメントで提案されているものの代わりにファイル:

(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 Platform を使用することにした場合、最後のカスタマイズ行を削除する必要があることを除いて、この「haskell-mode」構成はすべて適用されると思います。 (デフォルトの haskell-process-type auto の 適切なものを選択します。)

お役に立てば幸いです!


Linux
  1. LinuxにNodeJSをインストールする方法

  2. LinuxにVagrantをインストールする方法

  3. LinuxにTeamViewer15をインストールする方法

  1. LinuxにPythonをインストールする方法

  2. LinuxにFFmpegをインストールする方法

  3. LinuxにPIPをインストールする方法

  1. Linuxを3つのステップでインストールする方法

  2. LinuxにJavaをインストールする方法

  3. KaliLinuxのインストール方法