Anda memiliki tiga pilihan.
Platform Haskell
Ini adalah kemungkinan tetapi bukan pilihan yang populer karena banyak alasan yang akan Anda temukan pada waktunya jika Anda memilih untuk pergi dengan cara ini. Anda akan mendapatkan pengalaman yang jauh lebih baik dan mendapatkan banyak dukungan yang lebih baik dengan Stack atau Nix. Yang mana dari dua orang itu yang digunakan tampaknya sebagian besar tentang preferensi pribadi. Mereka adalah binatang yang berbeda tetapi bagi seorang pemula perbedaannya tidak akan segera terlihat sehingga ada sedikit harapan bahwa Anda akan dapat membuat "keputusan yang tepat". Cukup pilih satu dan evaluasi ulang nanti.
Tumpukan
Inilah yang saya sarankan kepada siapa pun (tidak terbiasa dengan Nix) yang ingin memulai dengan Haskell dengan cepat. Periode. Anda tidak perlu menginstal apa pun secara terpisah, Stack akan menangani semua barang Haskell untuk Anda. Anda biasanya tidak pernah menggunakan komplotan rahasia secara langsung dengan Stack. stack build
menggunakan komplotan internal tetapi Anda tidak perlu khawatir tentang itu. Satu hal yang perlu diperhatikan, Stack bukanlah pengelola paket. Ini adalah alat pembangun. Biasanya tidak memasang apa pun. Namun itu mengambil semua dependensi yang dibutuhkan dan menyimpannya di ~/.stack
bersama-sama dengan hal-hal lain.
Nix
Ini yang saya gunakan secara pribadi jadi saya mungkin bias tapi menurut saya ini adalah solusi terbaik secara keseluruhan dalam jangka panjang. Peringatannya adalah bahwa ada kurva belajar yang agak curam dan Anda diberi banyak kesempatan untuk menembak diri sendiri saat memulai.
Saya sangat merekomendasikan untuk memulai dengan Stack tetapi tetap berpikiran terbuka tentang Nix saat perjalanan Anda dengan Haskell berlanjut.
Inilah jawaban alternatif (panjang). Perhatikan bahwa saya dulu juga merekomendasikan Stack untuk pemula, tetapi sejak itu saya berubah pikiran.
TL;DR: Baik Platform Haskell atau instalasi Stack murni dapat memberi Anda semua yang Anda butuhkan, dan Anda tidak akan "kehilangan" apa pun dengan memilih satu atau yang lain. Anda mungkin akan merasa paling mudah untuk melewati Stack dan menginstal Platform Haskell menggunakan penginstal Linux "Generik", karena ia hadir dengan semua yang Anda butuhkan dan penyiapannya akan lebih cocok dengan apa yang dijelaskan dalam buku LYAH. Anda dapat menginstal Stack nanti saat Anda sedang melakukan pengembangan yang lebih serius pada banyak proyek. Jika Anda lebih memilih untuk tetap menggunakan instalasi Stack murni, saya sarankan memulai dengan alur kerja "hanya proyek global". Apa pun itu, Anda dapat menggunakan "mode-haskell" dengan beberapa perbaikan konfigurasi yang disarankan di bawah (termasuk setelan kunci yang akan diperlukan jika Anda bekerja dalam proyek global penginstalan Stack-saja).
Inilah jawaban panjangnya...
Stack vs. Platform vs. Cabal
Buku LYAH mendahului Stack, yang tentunya menjadi alasan utama buku itu tidak menyebutkannya. Di haskell.org, mereka merekomendasikan penggunaan penginstal minimal, Stack, atau Platform Haskell. Ketiga metode tersebut adalah cara yang sangat masuk akal di tahun 2018 untuk menyiapkan lingkungan Haskell yang berfungsi. Mereka berbeda baik dalam cara mereka memilih untuk mengisolasi versi kompiler dan/atau pustaka yang berbeda ke dalam "kotak pasir" untuk pekerjaan pengembangan, dan dalam seberapa banyak mereka menginstal awalnya , tetapi tidak ada yang "hilang" dari salah satu dari mereka yang tidak dapat dipasang sesuai permintaan. Tergantung mana yang Anda pilih, akan ada beberapa perbedaan dalam alur kerja Anda (lihat di bawah).
Baik Stack dan Cabal adalah manajer paket gabungan dan alat bangun. (Stack memiliki kemampuan tambahan untuk benar-benar mem-bootstrap seluruh instalasi Haskell, itulah mengapa ini juga merupakan metode instalasi dengan caranya sendiri.) Saat Anda mengerjakan LYAH, Anda tidak akan benar-benar menggunakan fungsionalitas "alat bangun" secara langsung pada proyek Anda sendiri. (Fasilitas build bawaan GHC lebih dari cukup untuk membangun project multi-modul kecil.) Anda hanya memerlukan fungsionalitas manajer paket untuk menginstal library tambahan.
Karena Stack dan Cabal mengelola paket mereka secara terpisah, jika Anda menggunakan Stack, Anda tidak perlu menggunakan Cabal secara langsung. Anda dapat menginstalnya jika Anda mau (dan faktanya, Stack menggunakan Cabal untuk beberapa fungsi esoteris, seperti "pemecah tumpukan", dan akan mengharuskannya diinstal dalam kasus tersebut):
$ stack install cabal-install
Tapi, meskipun ini akan menempatkan "cabal" ke "$HOME/.local/bin" (dan Anda ingin memastikan ini ada di jalur Anda), Anda akan menemukan bahwa Anda harus melewati rintangan untuk menjalankannya :
$ stack exec --no-ghc-package-path cabal -- list
dan itu tidak benar-benar berguna sejauh menyangkut lingkungan Stack Anda.
Perbarui: Catatan di jalur "$HOME/.local/bin". Sepertinya skrip instalasi dari https://get.haskellstack.org/ dapat menginstal Stack sendiri ke /usr/local/bin/stack
secara default jika tidak ada instalasi yang ada. Namun, seharusnya menampilkan peringatan untuk meletakkan $HOME/.local/bin
di jalur Anda. Jika Anda meningkatkan Stack di masa mendatang dengan stack upgrade
, itu akan menginstal versi baru dari stack
sana, dan direktori itu juga akan digunakan jika Anda menginstal paket yang menyertakan binari. Misalnya, stack install hlint
akan menginstal program Haskell Lint hlint
ke direktori itu. Jadi, merupakan ide bagus untuk memilikinya di jalur Anda dan di suatu tempat sebelum /usr/local/bin
.
Yang Hilang dari Tumpukan
Saya pikir itu mencakup tiga pertanyaan pertama Anda. Untuk yang terakhir, hal utama yang Anda lewatkan setelah menginstal Stack alih-alih Platform Haskell adalah, secara desain, Stack tidak benar-benar menginstal apa pun secara global selain "tumpukan" itu sendiri. Jadi, semua pekerjaan Haskell Anda termasuk menjalankan juru bahasa Haskell ("ghci") atau kompiler ("ghc"), semua harus dilakukan dalam lingkungan Stack, baik menggunakan perintah Stack terkait yang spesifik:
$ 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!
$
atau menggunakan "stack exec" untuk menjalankan program generik dalam lingkungan Stack yang sesuai. Misalnya, terkadang menjalankan Bash shell di bawah tumpukan dapat membantu, setelah itu hal-hal berperilaku seperti lingkungan Platform Haskell yang terinstal secara global:
$ 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. ...
$
Hal lain yang Anda lewatkan adalah bahwa Platform Haskell menginstal banyak perpustakaan umum secara default, sementara lingkungan Stack yang baru dimulai dengan hampir tidak ada (bahkan kompiler, sebelum Anda menjalankan stack setup
). Saat bekerja melalui LYAH, Anda mungkin perlu menginstal pustaka tambahan secara berkala. Misalnya, di Masukan dan Keluaran bab, contoh menggunakan angka acak (modul System.Random
) akan meminta Anda untuk menjalankan:
$ stack install random
dan mulai ulang juru bahasa Anda.
Rekomendasi untuk Menggunakan Platform Haskell
Karena Stack sedikit rumit dan Anda tidak akan benar-benar membutuhkan fasilitas yang disediakannya di awal, Anda mungkin merasa Platform Haskell lebih mudah digunakan saat baru memulai. (Penginstal "Generik" akan bekerja dengan baik pada distribusi Anda.) Ia hadir dengan semua yang terinstal, dan cara Anda menggunakannya akan lebih cocok dengan cara yang dijelaskan dalam LYAH. Bersama dengan haskell-mode
, Anda harus memiliki lingkungan Haskell yang cukup baik.
Secara umum, seharusnya tidak ada masalah memasang Stack dan Platform Haskell secara berdampingan (sebagaimana dibuktikan oleh fakta bahwa Platform Haskell sebenarnya termasuk Tumpukan). Stack akan memelihara semuanya secara terpisah di bawah subdirektori "$HOME/.stack", sehingga tidak akan ada gangguan antara kompiler atau paket atau apa pun. Perhatikan bahwa dalam penyiapan ini, Anda akan menggunakan cabal
untuk mengelola paket yang diinstal di sisi Platform, dan stack
-- tentunya -- untuk mengelola paket di sisi Stack.
Alur Kerja Pemula untuk Instalasi Tumpukan Murni
Jika Anda ingin tetap menggunakan penginstalan Stack murni, saya mungkin menyarankan alur kerja berikut saat Anda memulai:
Anda akan melihat referensi ke proyek Stack, dibuat dengan "stack new" atau "stack init". Hindari ini di awal, dan tetap gunakan tumpukan "proyek global". Ini adalah proyek implisit yang akan berlaku saat Anda menjalankan "tumpukan" di direktori yang tidak memiliki file "stack.yaml" (langsung atau di direktori induk):
$ cd
$ stack path --project-root
/u/buhr/.stack/global-project
$
Saat Anda bekerja di proyek global (yaitu, bukan di suatu tempat di bawah stack.yaml
file), Anda dapat memanggil juru bahasa dan kompiler dengan:
$ stack exec ghci
$ stack ghc -- -O2 Hello.hs
dan keduanya akan memiliki akses ke pustaka (paket) tambahan apa pun yang telah Anda instal menggunakan perintah seperti:
$ stack install random
Diperbarui: Catatan tentang perbedaan antara stack ghci
dan stack exec ghci
. Yang pertama dimaksudkan untuk menjalankan GHCI dalam konteks proyek lokal (yaitu, bekerja di bawah kode stack.yaml
mengajukan). Itu melewati beberapa flag tambahan untuk menyembunyikan paket yang diinstal secara global dan secara otomatis menyediakan modul dari paket Anda. Saat bekerja di proyek global, menurut saya tidak ada perbedaan praktis kecuali stack ghci
menghasilkan peringatan; dan apa pun yang Anda gunakan, Anda harus memuat modul Anda sendiri secara eksplisit dengan :load Whatever.hs
. Ada sedikit info lebih lanjut tentang perbedaannya di halaman dokumentasi Stack ini, khususnya di bagian bawah yang mencoba menjelaskan perbedaannya.
Akhirnya, Anda dapat beralih ke alur kerja yang menggunakan proyek Stack. Ini akan melibatkan penggunaan stack new
untuk membuat direktori proyek Stack baru, stack setup
untuk menginstal/menautkan versi kompiler pribadi ke direktori itu, dan kemudian memodifikasi xxx.cabal
proyek file (dan mungkin stack.yaml
file) untuk menunjukkan paket tambahan mana yang diperlukan, alih-alih menggunakan stack install
. Semuanya agak rumit jika Anda hanya ingin mulai menulis kode.
Anda juga dapat melihat referensi ke Intero, mode Emacs yang dirancang khusus untuk Stack. Intero sangat bagus, tetapi tidak berfungsi dengan baik saat mengerjakan file di proyek global. Ini cenderung ingin memulai juru bahasa di direktori "~/.stack/global-project", yang sangat tidak berguna. (Saya menggunakan Intero, tetapi saya telah menambalnya agar berperilaku lebih baik dalam hal ini.)
Mengonfigurasi Mode Haskell (untuk Platform atau Tumpukan)
Mungkin yang terbaik adalah tetap menggunakan "mode haskell", dan pikirkan tentang Intero saat Anda mulai menggunakan proyek non-global. Saya sarankan menginstal "haskell-mode" dari MELPA sesuai instruksi, tetapi tambahkan yang berikut ke .emacs
Anda file alih-alih apa yang disarankan dalam dokumentasi:
(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))
Saya telah menguji ini dengan instalasi Stack murni menggunakan "haskell-mode-20171022.26", dan tampaknya berfungsi dengan baik. Saya dapat memuat file Haskell baru di proyek global, mengirimkannya ke sesi interaktif dengan "C-c C-l", dan menelusuri kesalahan yang disorot di file sumber dengan "M-n" dan "M-p". (Kesalahan muncul di buffer mini.)
Jika Anda memutuskan untuk menggunakan Platform Haskell, menurut saya semua konfigurasi "mode haskell" ini akan tetap berlaku, kecuali Anda harus menghapus baris penyesuaian terakhir. (haskell-process-type
default dari auto
akan memilih sesuatu yang sesuai.)
Semoga itu bisa membantu!