Máte tři možnosti.
Platforma Haskell
Je to možnost, ale ne populární volba z mnoha důvodů, které včas zjistíte, pokud se rozhodnete jít touto cestou. Budete mít mnohem lepší zkušenosti a získáte hodně lepší podpora s Stack nebo Nix. Který z těchto dvou lidí používá se zdá být většinou o osobních preferencích. Jsou to různá zvířata, ale pro začátečníka nebudou rozdíly okamžitě zřejmé, takže je malá naděje, že budete schopni učinit „informované rozhodnutí“. Stačí si vybrat a přehodnotit později.
Zásobník
To je to, co bych doporučil každému (ne obeznámen s Nixem), který chce rychle začít s Haskellem. Doba. Nemusíte nic instalovat samostatně, Stack se postará o všechny věci Haskell za vás. Normálně nikdy nepoužíváte cabal přímo se Stackem. stack build
používá cabal interně, ale nemusíte se o to starat. Jedna věc, kterou je třeba poznamenat, Stack není správce balíčků. Je to stavební nástroj. Obvykle se neinstaluje cokoliv. Načte však všechny potřebné závislosti a uloží je do ~/.stack
spolu s dalšími věcmi.
Nix
To je to, co osobně používám, takže mohu být zaujatý, ale myslím, že je to celkově nejlepší řešení z dlouhodobého hlediska. Upozornění je, že je zde poměrně strmá křivka učení a máte mnoho šancí, abyste se na začátku střelili do nohy.
Vřele doporučuji začít Stackem, ale ponechat si otevřenou mysl ohledně Nixe, zatímco vaše cesta s Haskellem pokračuje.
Zde je (dlouhá) alternativní odpověď. Všimněte si, že jsem dříve doporučoval Stack i pro začátečníky, ale poté jsem změnil názor.
TL;DR: Buď Haskell Platform nebo čistá instalace Stack vám může poskytnout vše, co potřebujete, a výběrem jednoho nebo druhého vám nic „nebude chybět“. Pravděpodobně bude nejsnazší přeskočit Stack a nainstalovat Haskell Platform pomocí „Generic“ linuxového instalátoru, protože je dodáván se vším, co potřebujete, a nastavení bude přesněji odpovídat tomu, co je popsáno v knize LYAH. Stack můžete nainstalovat později, když děláte serióznější vývoj na více projektech. Pokud raději zůstanete u čisté instalace Stack, navrhoval bych začít s pracovním postupem „pouze globální projekt“. V každém případě můžete použít „haskell-mode“ s některými opravami konfigurace navrženými níže (včetně nastavení klíče, které bude vyžadováno, pokud pracujete v globálním projektu instalace pouze pro Stack).
Zde je dlouhá odpověď...
Stack vs. platforma vs. Cabal
Kniha LYAH je starší než Stack, což je jistě hlavní důvod, proč ji nezmiňuje. Na haskell.org doporučují použít buď minimální instalátor, Stack, nebo Haskell Platform. Všechny tři metody jsou naprosto rozumné způsoby, jak v roce 2018 nastavit fungující prostředí Haskell. Liší se jak ve způsobu, jakým se rozhodnou izolovat různé verze kompilátoru a/nebo knihoven do „izolovaných prostorů“ pro vývojovou práci, tak v tom, jak moc se instalují zpočátku , ale u žádného z nich „nechybí“ nic, co by nebylo možné nainstalovat na vyžádání. V závislosti na tom, co si vyberete, budou určité rozdíly ve vašem pracovním postupu (viz níže).
Stack i Cabal jsou kombinovaní správci balíčků a sestavení nástrojů. (Stack má přidanou schopnost skutečně zavést celou instalaci Haskellu, což je důvod, proč je to také metoda instalace sama o sobě.) Zatímco budete pracovat přes LYAH, nebudete ve skutečnosti přímo používat funkci "nástroje pro sestavení" na svých vlastních projektech. (Vestavěná zařízení GHC jsou více než dostačující pro vytváření malých projektů s více moduly.) K instalaci dalších knihoven budete potřebovat pouze funkci správce balíčků.
Protože Stack a Cabal spravují své balíčky samostatně, pokud používáte Stack, nebudete muset používat přímo Cabal. Pokud chcete, můžete si jej nainstalovat (a ve skutečnosti Stack využívá Cabal pro některé esoterické funkce, jako je "stack solver", a v těchto případech bude vyžadovat jeho instalaci):
$ stack install cabal-install
Ale i když to vloží "cabal" do "$HOME/.local/bin" (a budete se chtít ujistit, že je to ve vaší cestě), zjistíte, že k jeho spuštění musíte proskočit obručemi :
$ stack exec --no-ghc-package-path cabal -- list
a ve skutečnosti nedělá nic užitečného, pokud jde o vaše prostředí Stack.
Aktualizace: Poznámka k cestě „$HOME/.local/bin“. Zdá se, že instalační skript z https://get.haskellstack.org/ může nainstalovat samotný Stack do /usr/local/bin/stack
ve výchozím nastavení, pokud neexistuje žádná instalace. Mělo by se však zobrazit upozornění na zadání $HOME/.local/bin
ve vaší cestě. Pokud v budoucnu upgradujete Stack s stack upgrade
, nainstaluje novou verzi stack
tam a tento adresář bude také použit, pokud instalujete balíčky, které obsahují binární soubory. Například stack install hlint
nainstaluje program Haskell Lint hlint
do toho adresáře. Takže je dobré mít to v cestě a někde před /usr/local/bin
.
Co chybí v zásobníku
Myslím, že to pokrývá vaše první tři otázky. A konečně, hlavní věc, kterou po instalaci Stacku namísto platformy Haskell postrádáte, je to, že podle návrhu Stack ve skutečnosti globálně neinstaluje nic jiného než samotný „stack“. Takže veškerá vaše práce s Haskellem, včetně spuštění interpretru Haskellu ("ghci") nebo kompilátoru ("ghc"), musí být provedena v prostředí Stack, buď pomocí specifického odpovídajícího příkazu 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!
$
nebo jinak pomocí "stack exec" ke spuštění generického programu v rámci vhodného prostředí Stack. Někdy může být například užitečné spustit Bash shell pod zásobníkem, po kterém se věci chovají jako globálně nainstalované prostředí platformy 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. ...
$
Další věc, kterou postrádáte, je, že platforma Haskell standardně instaluje celou řadu běžných knihoven, zatímco nové prostředí Stack začíná téměř s ničím (ani kompilátorem, než spustíte stack setup
). Při práci s LYAH možná zjistíte, že budete muset pravidelně instalovat další knihovny. Například v Input and Output kapitola, příklady s použitím náhodných čísel (modul System.Random
) bude vyžadovat, abyste spustili:
$ stack install random
a restartujte svůj tlumočník.
Doporučení používat platformu Haskell
Vzhledem k tomu, že Stack je trochu komplikovaný a na začátku nebudete skutečně potřebovat vybavení, které poskytuje, může se vám zdát, že použití platformy Haskell je snazší, když začínáte. (Instalační program "Generic" by měl ve vaší distribuci fungovat dobře.) Dodává se se vším nainstalovaným a způsob, jakým jej používáte, bude přesněji odpovídat tomu, jak jsou věci popsány v LYAH. Společně s haskell-mode
, měli byste mít docela slušné prostředí Haskell.
Obecně by neměl být problém s instalací Stack a platformy Haskell vedle sebe (jak dokazuje skutečnost, že platforma Haskell ve skutečnosti zahrnuje Zásobník). Stack bude vše udržovat samostatně v podadresáři "$HOME/.stack", takže nedojde k žádné interferenci mezi kompilátory nebo balíčky nebo tak. Všimněte si, že v tomto nastavení použijete cabal
pro správu balíčků nainstalovaných na straně platformy a stack
-- samozřejmě -- pro správu balíčků na straně zásobníku.
Pracovní postup pro začátečníky pro instalaci čistého zásobníku
Pokud chcete zůstat u své čisté instalace Stack, mohu vám na začátku navrhnout následující pracovní postup:
Uvidíte odkazy na projekty Stack vytvořené pomocí „stack new“ nebo „stack init“. Těm se na začátku vyhněte a zůstaňte u zásobníku „globální projekt“. Toto je implicitní projekt, který bude účinný, když spustíte „stack“ v adresáři, který nemá soubor „stack.yaml“ (přímo nebo v nadřazeném adresáři):
$ cd
$ stack path --project-root
/u/buhr/.stack/global-project
$
Když pracujete v globálním projektu (tj. ne někde pod stack.yaml
soubor), můžete interpret a kompilátor vyvolat pomocí:
$ stack exec ghci
$ stack ghc -- -O2 Hello.hs
a oba budou mít přístup ke všem dalším knihovnám (balíčkům), které jste nainstalovali pomocí příkazů jako:
$ stack install random
Aktualizováno: Poznámka k rozdílu mezi stack ghci
a stack exec ghci
. První jmenovaný je určen ke spuštění GHCi v kontextu místního projektu (tj. pracuje pod stack.yaml
soubor). Předává některé další příznaky pro skrytí globálně nainstalovaných balíčků a pro automatické zpřístupnění modulů z vašeho balíčku. Při práci v globálním projektu si nemyslím, že existuje nějaký praktický rozdíl kromě toho, že stack ghci
generuje varování; a bez ohledu na to, který používáte, budete muset načíst své vlastní moduly explicitně pomocí :load Whatever.hs
. Na této stránce dokumentace Stack je trochu více informací o rozdílu, zejména v dolní části, kde se snaží vysvětlit rozdíl.
Nakonec můžete přejít na pracovní postup, který používá projekty Stack. To bude zahrnovat použití stack new
pro vytvoření nového adresáře projektu Stack, stack setup
nainstalovat/propojit verzi soukromého kompilátoru do tohoto adresáře a poté upravit xxx.cabal
projektu soubor (a možná jeho stack.yaml
file) k označení, které další balíčky jsou vyžadovány, namísto použití stack install
. Je to všechno trochu komplikované, když chcete začít psát kód.
Můžete také vidět odkaz na Intero, režim Emacs navržený speciálně pro Stack. Intero je velmi pěkné, ale při práci se soubory v globálním projektu moc nefunguje. Bude to chtít spustit interpret v adresáři "~/.stack/global-project", což je docela k ničemu. (Používám Intero, ale upravil jsem ho, aby se v tomto ohledu chovalo lépe.)
Konfigurace režimu Haskell (pro platformu nebo zásobník)
Pravděpodobně bude nejlepší místo toho zůstat u „haskell-mode“ a myslet na Intero, až začnete používat neglobální projekty. Navrhoval bych nainstalovat "haskell-mode" z MELPA podle pokynů, ale přidat následující do .emacs
soubor namísto toho, co je navrženo v dokumentaci:
(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))
Testoval jsem to s čistou instalací Stack pomocí "haskell-mode-20171022.26" a zdá se, že to funguje dobře. Mohu načíst nový soubor Haskell v globálním projektu, odeslat jej do interaktivní relace pomocí „C-c C-l“ a procházet zvýrazněné chyby ve zdrojovém souboru pomocí „M-n“ a „M-p“. (Chyby se objeví v minibufferu.)
Pokud se místo toho rozhodnete použít platformu Haskell, myslím si, že veškerá tato konfigurace „režimu haskell“ bude stále platit, kromě toho, že byste měli odstranit úplně poslední řádek přizpůsobení. (Výchozí haskell-process-type
z auto
vybere něco vhodného.)
Doufám, že to pomůže!