Programowanie w systemie UNIX/Haskell: Różnice pomiędzy wersjami
→cabal: unrecognised command: sandbox (try --help): export PATH="$HOME/.cabal/bin:${PATH}" |
literówki, linki, interpunkcja, formatowanie |
||
Linia 6: | Linia 6: | ||
[[Haskell]] zmieni twój sposób myślenia o programowaniu (:-)) |
[[Haskell]] zmieni twój sposób myślenia o programowaniu (:-)) |
||
Wykorzystuje |
Wykorzystuje [[W:Teoria kategorii|teorię kategorii]].<ref>[[w:Teoria kategorii|Teoria kategorii]]</ref> |
||
=Cechy Haskella = |
=Cechy Haskella = |
||
* jest to język czysto funkcyjny:<ref>[http://wazniak.mimuw.edu.pl/index.php?title=Paradygmaty_programowania/Wyk%C5%82ad_10:_Programowanie_funkcyjne_w_Haskellu_I| Paradygmaty_programowania : Małgorzata Moczurad i Włodzimierz Moczurad — Uniwersytet Jagielloński ]</ref> |
* jest to język czysto funkcyjny:<ref>[http://wazniak.mimuw.edu.pl/index.php?title=Paradygmaty_programowania/Wyk%C5%82ad_10:_Programowanie_funkcyjne_w_Haskellu_I| Paradygmaty_programowania : Małgorzata Moczurad i Włodzimierz Moczurad — Uniwersytet Jagielloński ]</ref> |
||
** nie ma zmiennych w |
** nie ma zmiennych w znaczeniu pojemników na wartości jak np. w [[C]], są stałe (niewiadome jak w matematyce) |
||
** nie ma efektów ubocznych |
** nie ma efektów ubocznych |
||
* lenistwo: obliczenia są wykonywane w momencie kiedy ich rezultat jest potrzebny, nie wcześniej. W efekcie możesz definiować nieskończone struktury danych, pod warunkiem, że nie używasz ich w całości. |
* lenistwo: obliczenia są wykonywane w momencie kiedy ich rezultat jest potrzebny, nie wcześniej. W efekcie możesz definiować nieskończone struktury danych, pod warunkiem, że nie używasz ich w całości. |
||
* nie ma pętli (używa rekurencji)<ref>[http://gnosis.cx/publish/programming/Haskell.pdf David Mertz - Haskell tutorial]</ref> |
* nie ma pętli (używa rekurencji)<ref>[http://gnosis.cx/publish/programming/Haskell.pdf David Mertz - Haskell tutorial]</ref> |
||
* funkcje wyższego rzędu - funkcje mogą być argumentami innych funkcji. Umożliwia to składanie przekształceń |
* funkcje wyższego rzędu - funkcje mogą być argumentami innych funkcji. Umożliwia to składanie przekształceń. |
||
* polimorfizm |
* polimorfizm |
||
* klasy typów |
* klasy typów |
||
Linia 29: | Linia 29: | ||
* z użyciem standardowych instalatorów (stabilna, ale zwykle nie najnowsza wersja), np.: |
* z użyciem standardowych instalatorów (stabilna, ale zwykle nie najnowsza wersja), np.: |
||
** Centrum Oprogramowania Ubuntu |
** Centrum Oprogramowania Ubuntu |
||
** Menadżer Pakietów |
** Menadżer Pakietów Synaptic |
||
* ręczna najnowszej wersji <ref>[http://gracjanpolak.wordpress.com/2010/05/17/instalacja-ghc-w-wersji-minimalnej/ Gracjan Polak - Instalacja GHC w wersji minimalnej]</ref> |
* ręczna najnowszej wersji <ref>[http://gracjanpolak.wordpress.com/2010/05/17/instalacja-ghc-w-wersji-minimalnej/ Gracjan Polak - Instalacja GHC w wersji minimalnej]</ref> |
||
Linia 72: | Linia 72: | ||
product [1..10] |
product [1..10] |
||
Listy nieskończone ( |
Listy nieskończone (przykład [[Haskell#Leniwe_warto.C5.9Bciowanie|leniwego wartościowania]]): <ref>[http://www.deltami.edu.pl/temat/informatyka/2013/06/29/strumienie.pdf "Strumienie, czyli pochwała lenistwa" artykuł Marcina Benke, Delta, lipiec 2013 ]</ref> |
||
[1,3..] |
[1,3..] |
||
Linia 86: | Linia 86: | ||
==Wejście i wyjście == |
==Wejście i wyjście == |
||
Wczytywanie argumentów |
Wczytywanie argumentów: |
||
-- http://zvon.org/other/haskell/Outputsystem/getArgs_f.html |
-- http://zvon.org/other/haskell/Outputsystem/getArgs_f.html |
||
-- save it as a file a.hs |
-- save it as a file a.hs |
||
Linia 95: | Linia 95: | ||
print x |
print x |
||
Wczytywanie pliku tekstowego, którego nazwa jest podana jako argument programu |
Wczytywanie pliku tekstowego, którego nazwa jest podana jako argument programu: |
||
-- save it as a file f.hs |
-- save it as a file f.hs |
||
Linia 112: | Linia 112: | ||
==hs== |
==hs== |
||
Pliki z |
Pliki z rozszerzeniem ''hs'' zawierają kod Haskella. |
||
===Funkcje=== |
===Funkcje=== |
||
Definicję funkcji mojafunkcja '''zapisz do pliku''' mojafunkcja.hs |
Definicję funkcji ''mojafunkcja'' '''zapisz do pliku''' ''mojafunkcja.hs'' |
||
W trybie interaktywnym ( ghci) '''wczytujesz''' funkcję za pomocą komendy |
W trybie interaktywnym ( ghci) '''wczytujesz''' funkcję za pomocą komendy: |
||
:l mojafunkcja |
:l mojafunkcja |
||
albo |
albo |
||
Linia 128: | Linia 128: | ||
Nazwa modułu odpowiada nazwie pliku, z wyjątkiem modułu głównego. |
Nazwa modułu odpowiada nazwie pliku, z wyjątkiem modułu głównego. |
||
Standardowe moduły |
Standardowe moduły: |
||
* Prelude<ref>[http://www.haskell.org/onlinereport/standard-prelude.html Moduł Prelude]</ref> |
* Prelude<ref>[http://www.haskell.org/onlinereport/standard-prelude.html Moduł Prelude]</ref> |
||
===Pakiet=== |
===Pakiet=== |
||
Pakiet '''zawsze zawiera''' |
Pakiet '''zawsze zawiera''': <ref>[http://www.haskell.org/cabal/proposal/x138.html System pakietów Haskella]</ref> |
||
* jeden lub kilka modułów |
* jeden lub kilka modułów |
||
'''Może zawierać''' |
'''Może zawierać''': |
||
* kod w języku C |
* kod w języku C |
||
* pliki nagłówkowe |
* pliki nagłówkowe |
||
* dokumentację |
* dokumentację |
||
* testy dla zawartych modułów |
* testy dla zawartych modułów |
||
* dodatkowe narzędzia |
* dodatkowe narzędzia |
||
Polecenie |
Polecenie: |
||
ghc-pkg list |
ghc-pkg list |
||
Linia 148: | Linia 148: | ||
pokazuje '''listę zainstalowanych pakietów''' <ref>[http://www.haskell.org/ghc/docs/7.0.3/html/users_guide/packages.html Pakiety Haslkella]</ref> |
pokazuje '''listę zainstalowanych pakietów''' <ref>[http://www.haskell.org/ghc/docs/7.0.3/html/users_guide/packages.html Pakiety Haslkella]</ref> |
||
Możemy poprosić o '''opis''' jednego z zainstalowanych modułów, np time |
Możemy poprosić o '''opis''' jednego z zainstalowanych modułów, np ''time'': |
||
ghc-pkg describe time |
ghc-pkg describe time |
||
Linia 154: | Linia 154: | ||
====Cabal==== |
====Cabal==== |
||
Cabal jest to program ułatwiający pracę z |
Cabal jest to program ułatwiający pracę z pakietami. |
||
Pakiety cabala mogą występować w 3 postaciach |
Pakiety cabala mogą występować w 3 postaciach: |
||
* kodu |
* kodu źródłowego (skompresowanego w plikach tar-ball, zip) |
||
* plikach binarnych |
* plikach binarnych |
||
* specjalnych postaciach |
* specjalnych postaciach: RPM, pakiety Debiana, windows <ref>[http://www.haskell.org/cabal/proposal/x138.html Pakiety w Haskellu]</ref> |
||
===Program=== |
===Program=== |
||
Kompletny program w Haskellu zawiera jeden lub więcej modułów ( |
Kompletny program w Haskellu zawiera jeden lub więcej modułów (w tym główny moduł Main) skompilowanych z użyciem pakietów (w tym pakiet Prelude) |
||
==== Pierwszy program ==== |
==== Pierwszy program ==== |
||
Najprostszy program składa się z |
Najprostszy program składa się z:<ref>[http://www.haskell.org/ghc/docs/7.0.3/html/users_guide/packages.html Pakiety w Haskellu ]</ref> |
||
* jednego głównego pakietu |
* jednego głównego pakietu (main) |
||
* jednego głównego modułu (Main) |
* jednego głównego modułu (Main) |
||
* jednej głównej funkcji ( |
* jednej głównej funkcji (main). <ref>[[wikibooks:Haskell/YAHT/Language_basics#Source_Code_Files |Pliki z kodem źródłowym w ang podręczniku]]</ref><ref>[[wikibooks:wikibooks:Haskell/Applications|Aplikacja Haskella w ang wikibooks]]</ref> |
||
-- moduł główny Main |
-- moduł główny Main |
||
Linia 178: | Linia 178: | ||
main = putStrLn "Hello world" |
main = putStrLn "Hello world" |
||
Program zapisujemy do pliku, np. w.hs |
Program zapisujemy do pliku, np. <code>w.hs</code> |
||
Jak widać nazwa pliku zawierającego moduł główny nie musi być taka |
Jak widać nazwa pliku zawierającego moduł główny nie musi być taka sama jak nazwa modułu. |
||
Program kompilujemy |
Program kompilujemy: |
||
ghc -o w w.hs |
ghc -o w w.hs |
||
i uruchomiamy |
i uruchomiamy: |
||
./w |
./w |
||
Linia 195: | Linia 195: | ||
==hsl== |
==hsl== |
||
Pliki z rozszerzeniem hsl |
Pliki z rozszerzeniem hsl zawierają kod w stylu programowania piśmiennego (ang. literate programming) <ref>[[w:Literate programming | Programowanie piśmienne w wikipedii]]</ref> |
||
=Jak pracować w Haskellu = |
=Jak pracować w Haskellu = |
||
* tryb interaktywny ( |
* tryb interaktywny (ghci) |
||
* kompilacja kodu ( |
* kompilacja kodu (ghc) |
||
* z użyciem skryptu runhaskell |
* z użyciem skryptu runhaskell |
||
== runhaskell== |
== runhaskell== |
||
Z użyciem skryptu BASHA |
Z użyciem skryptu BASHA: |
||
runhaskell m.hs |
runhaskell m.hs |
||
== ghc == |
== ghc == |
||
W trybie kompilacji najpierw kompilujemy |
W trybie kompilacji najpierw kompilujemy: |
||
ghc -o m m.hs |
ghc -o m m.hs |
||
potem uruchamiamy wykonywalny plik |
potem uruchamiamy wykonywalny plik: |
||
./m |
./m |
||
==ghci== |
==ghci== |
||
W trybie interaktywnym |
W trybie interaktywnym: |
||
ghci m.hs |
ghci m.hs |
||
potem uruchamiamy funkcję |
potem uruchamiamy funkcję: |
||
main |
main |
||
Ładowanie ( |
Ładowanie (wczytanie) modułów: |
||
:load + nazwa |
:load + nazwa |
||
Po wczytaniu modułu trzeba go uaktywnić |
Po wczytaniu modułu trzeba go uaktywnić: |
||
:module + nazwa |
:module + nazwa |
||
np. |
np.: |
||
:m + Fractal.RUFF.Mandelbrot.Address |
:m + Fractal.RUFF.Mandelbrot.Address |
||
uaktywnia moduł Address z pakietu RUFF ( |
uaktywnia moduł Address z pakietu RUFF (''m'' jest skrótem od ''module'' <ref>[http://www.haskell.org/ghc/docs/latest/html/users_guide/interactive-evaluation.html#ghci-scope Using GHCi doc]</ref>) |
||
=Problemy= |
=Problemy= |
||
Linia 239: | Linia 239: | ||
==cabal: unrecognised command: sandbox (try --help)== |
==cabal: unrecognised command: sandbox (try --help)== |
||
Może wersja cabala jest za stara |
Może wersja cabala jest za stara?<ref>[http://stackoverflow.com/questions/23897816/cabal-run-gives-unrecognised-command-run Stackoverflow question: cabal-run-gives-unrecognised-command-run]</ref> |
||
Sprawdzamy |
Sprawdzamy: |
||
cabal -V |
cabal -V |
||
przykładowy wynik: |
|||
cabal-install version 1.16.0.2 |
cabal-install version 1.16.0.2 |
||
using version 1.16.0 of the Cabal library |
using version 1.16.0 of the Cabal library |
||
upgrade |
upgrade: |
||
cabal install cabal-install |
cabal install cabal-install |
||
oraz |
oraz: |
||
export PATH="$HOME/.cabal/bin:${PATH}" |
export PATH="$HOME/.cabal/bin:${PATH}" |
||
=Zobacz również= |
=Zobacz również= |
||
* [http://www.ia.pw.edu.pl/~mszlenk/ Marcin Szlenk - |
* [http://www.ia.pw.edu.pl/~mszlenk/ Marcin Szlenk - programowanie w języku Haskell i funkcyjne] |
||
* [http://www.slideshare.net/guestc1e6127/haskell-presentation-794922 |
* [http://www.slideshare.net/guestc1e6127/haskell-presentation-794922 Haskell - Tomek „QsoRiX” Rydzynski] |
||
* [http://wazniak.mimuw.edu.pl/index.php?title=Programowanie_funkcyjne |
* [http://wazniak.mimuw.edu.pl/index.php?title=Programowanie_funkcyjne Programowanie funkcyjne - Marcin Kubica] |
||
=Odnośniki= |
=Odnośniki= |
Wersja z 13:29, 28 lis 2016
"A language that doesn't affect the way you think about programming, is not worth knowing. "[1]
Haskell zmieni twój sposób myślenia o programowaniu (:-))
Wykorzystuje teorię kategorii.[2]
Cechy Haskella
- jest to język czysto funkcyjny:[3]
- nie ma zmiennych w znaczeniu pojemników na wartości jak np. w C, są stałe (niewiadome jak w matematyce)
- nie ma efektów ubocznych
- lenistwo: obliczenia są wykonywane w momencie kiedy ich rezultat jest potrzebny, nie wcześniej. W efekcie możesz definiować nieskończone struktury danych, pod warunkiem, że nie używasz ich w całości.
- nie ma pętli (używa rekurencji)[4]
- funkcje wyższego rzędu - funkcje mogą być argumentami innych funkcji. Umożliwia to składanie przekształceń.
- polimorfizm
- klasy typów
- monady
Instalacja
Potrzebujemy:
- kompilator/interpreter (GHC)
- menadżer pakietów (cabal)
- edytor (np. Gedit ma podświetlanie składni Haskella)
Metody:
- z użyciem standardowych instalatorów (stabilna, ale zwykle nie najnowsza wersja), np.:
- Centrum Oprogramowania Ubuntu
- Menadżer Pakietów Synaptic
- ręczna najnowszej wersji [5]
Przykłady
Funkcje
Przykład[6]
Haskellsquare :: Int -> Int square n = n*n |
Cint square(int n) {
return n*n; }
|
Listy
Listy skończone [7]
sum [1..10]
product [1..10]
Listy nieskończone (przykład leniwego wartościowania): [8]
[1,3..] [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,{Interrupted!}
take 20 [1,3..] [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39]
Klasy
Monady
Wejście i wyjście
Wczytywanie argumentów:
-- http://zvon.org/other/haskell/Outputsystem/getArgs_f.html -- save it as a file a.hs -- runhaskell a.hs 1 33 aaaa import System main = do x <- getArgs print x
Wczytywanie pliku tekstowego, którego nazwa jest podana jako argument programu:
-- save it as a file f.hs -- runhaskell f.hs gruff.txt import System main = do args <- System.getArgs let fileName = head args print fileName -- read text file text <- readFile fileName -- putStrLn text
Pliki z kodem w Haskellu
hs
Pliki z rozszerzeniem hs zawierają kod Haskella.
Funkcje
Definicję funkcji mojafunkcja zapisz do pliku mojafunkcja.hs W trybie interaktywnym ( ghci) wczytujesz funkcję za pomocą komendy:
:l mojafunkcja
albo
:r -- reload current script
Moduł
Moduł zawiera kilka funkcji. Każdy moduł to jeden plik. Nazwa modułu odpowiada nazwie pliku, z wyjątkiem modułu głównego.
Standardowe moduły:
- Prelude[9]
Pakiet
Pakiet zawsze zawiera: [10]
- jeden lub kilka modułów
Może zawierać:
- kod w języku C
- pliki nagłówkowe
- dokumentację
- testy dla zawartych modułów
- dodatkowe narzędzia
Polecenie:
ghc-pkg list
pokazuje listę zainstalowanych pakietów [11]
Możemy poprosić o opis jednego z zainstalowanych modułów, np time:
ghc-pkg describe time
Cabal
Cabal jest to program ułatwiający pracę z pakietami.
Pakiety cabala mogą występować w 3 postaciach:
- kodu źródłowego (skompresowanego w plikach tar-ball, zip)
- plikach binarnych
- specjalnych postaciach: RPM, pakiety Debiana, windows [12]
Program
Kompletny program w Haskellu zawiera jeden lub więcej modułów (w tym główny moduł Main) skompilowanych z użyciem pakietów (w tym pakiet Prelude)
Pierwszy program
Najprostszy program składa się z:[13]
- jednego głównego pakietu (main)
- jednego głównego modułu (Main)
- jednej głównej funkcji (main). [14][15]
-- moduł główny Main module Main (main) -- nazwa eksportowanej funkcji where -- definicja funkcji main main = putStrLn "Hello world"
Program zapisujemy do pliku, np. w.hs
Jak widać nazwa pliku zawierającego moduł główny nie musi być taka sama jak nazwa modułu.
Program kompilujemy:
ghc -o w w.hs
i uruchomiamy:
./w
Pierwszy projekt
Projekt [16]
hsl
Pliki z rozszerzeniem hsl zawierają kod w stylu programowania piśmiennego (ang. literate programming) [17]
Jak pracować w Haskellu
- tryb interaktywny (ghci)
- kompilacja kodu (ghc)
- z użyciem skryptu runhaskell
runhaskell
Z użyciem skryptu BASHA:
runhaskell m.hs
ghc
W trybie kompilacji najpierw kompilujemy:
ghc -o m m.hs
potem uruchamiamy wykonywalny plik:
./m
ghci
W trybie interaktywnym:
ghci m.hs
potem uruchamiamy funkcję:
main
Ładowanie (wczytanie) modułów:
:load + nazwa
Po wczytaniu modułu trzeba go uaktywnić:
:module + nazwa
np.:
:m + Fractal.RUFF.Mandelbrot.Address
uaktywnia moduł Address z pakietu RUFF (m jest skrótem od module [18])
Problemy
cabal: unrecognised command: sandbox (try --help)
Może wersja cabala jest za stara?[19] Sprawdzamy:
cabal -V
przykładowy wynik:
cabal-install version 1.16.0.2 using version 1.16.0 of the Cabal library
upgrade:
cabal install cabal-install
oraz:
export PATH="$HOME/.cabal/bin:${PATH}"
Zobacz również
- Marcin Szlenk - programowanie w języku Haskell i funkcyjne
- Haskell - Tomek „QsoRiX” Rydzynski
- Programowanie funkcyjne - Marcin Kubica
Odnośniki
- ↑ EPIGRAMS IN PROGRAMMING
- ↑ Teoria kategorii
- ↑ Paradygmaty_programowania : Małgorzata Moczurad i Włodzimierz Moczurad — Uniwersytet Jagielloński
- ↑ David Mertz - Haskell tutorial
- ↑ Gracjan Polak - Instalacja GHC w wersji minimalnej
- ↑ Podobne Beginning with the Haskell Programming Language by gnosis
- ↑ Programowanie w Haskellu - Artur Zawłocki
- ↑ "Strumienie, czyli pochwała lenistwa" artykuł Marcina Benke, Delta, lipiec 2013
- ↑ Moduł Prelude
- ↑ System pakietów Haskella
- ↑ Pakiety Haslkella
- ↑ Pakiety w Haskellu
- ↑ Pakiety w Haskellu
- ↑ Pliki z kodem źródłowym w ang podręczniku
- ↑ Aplikacja Haskella w ang wikibooks
- ↑ Struktura pierwszego projeltu w Haskellu
- ↑ Programowanie piśmienne w wikipedii
- ↑ Using GHCi doc
- ↑ Stackoverflow question: cabal-run-gives-unrecognised-command-run