Programowanie w systemie UNIX/Haskell: Różnice pomiędzy wersjami

Z Wikibooks, biblioteki wolnych podręczników.
Usunięta treść Dodana treść
→‎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 teorię kategorii .<ref>[[w:Teoria kategorii|Teoria kategorii]]</ref>
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 znaczenie pojemników na wartości jak np. w [[C]], są stałe (niewiadome jak w matematyce)
** 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 SYnaptic
** 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 ( przykład [[Haskell#Leniwe_warto.C5.9Bciowanie|leniwego wartościowanie]] ): <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>
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 roszerzeniem hs zawierają kod Haskella.
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''' : <ref>[http://www.haskell.org/cabal/proposal/x138.html System pakietów Haskella]</ref>
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 pakietami.
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 żródłowego (skompresowanego w plikach tar-ball, zip )
* kodu źródłowego (skompresowanego w plikach tar-ball, zip)
* plikach binarnych
* plikach binarnych
* specjalnych postaciach : RPM, pakiety Debiana, windows <ref>[http://www.haskell.org/cabal/proposal/x138.html Pakiety w Haskellu]</ref>
* 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 ( w tym główny moduł Main ) skompilowanych z użyciem pakietów ( w tym pakiet Prelude )
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 :<ref>[http://www.haskell.org/ghc/docs/7.0.3/html/users_guide/packages.html Pakiety w Haskellu ]</ref>
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 o ( main)
* jednego głównego pakietu (main)
* jednego głównego modułu (Main)
* jednego głównego modułu (Main)
* jednej głównej funkcji ( main). <ref>[[:en:Haskell/YAHT/Language_basics#Source_Code_Files | Pliki z kodem żródłowym w ang podręczniku]]</ref><ref>[[:en:wikibooks:Haskell/Applications| Aplikacja Haskella w ang wikibooks]]</ref>
* 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 sam jak nazwa modułu.
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 zawierając kod w stylu programowania piśmiennego ( ang. literate programming) <ref>[[w:Literate programming | Programowanie piśmienne w wikipedii]]</ref>
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 ( ghci)
* tryb interaktywny (ghci)
* kompilacja kodu ( ghc)
* 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 ( wczytanie) modułów :
Ł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 ( 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>)
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 ?<ref>[http://stackoverflow.com/questions/23897816/cabal-run-gives-unrecognised-command-run Stackoverflow question : cabal-run-gives-unrecognised-command-run]</ref>
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łądowy wynik :
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 - progrmowanie w języku Haskell i funkcyjne]
* [http://www.ia.pw.edu.pl/~mszlenk/ Marcin Szlenk - programowanie w języku Haskell i funkcyjne]
* [http://www.slideshare.net/guestc1e6127/haskell-presentation-794922 | Haskell - Tomek „QsoRiX” Rydzynski]
* [http://www.slideshare.net/guestc1e6127/haskell-presentation-794922 Haskell - Tomek „QsoRiX” Rydzynski]
* [http://wazniak.mimuw.edu.pl/index.php?title=Programowanie_funkcyjne | Programowanie funkcyjne - Marcin Kubica ]
* [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]


Haskell

square :: Int -> Int 
square n = n*n 

C

int 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:

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ż

Odnośniki

  1. EPIGRAMS IN PROGRAMMING
  2. Teoria kategorii
  3. Paradygmaty_programowania : Małgorzata Moczurad i Włodzimierz Moczurad — Uniwersytet Jagielloński
  4. David Mertz - Haskell tutorial
  5. Gracjan Polak - Instalacja GHC w wersji minimalnej
  6. Podobne Beginning with the Haskell Programming Language by gnosis
  7. Programowanie w Haskellu - Artur Zawłocki
  8. "Strumienie, czyli pochwała lenistwa" artykuł Marcina Benke, Delta, lipiec 2013
  9. Moduł Prelude
  10. System pakietów Haskella
  11. Pakiety Haslkella
  12. Pakiety w Haskellu
  13. Pakiety w Haskellu
  14. Pliki z kodem źródłowym w ang podręczniku
  15. Aplikacja Haskella w ang wikibooks
  16. Struktura pierwszego projeltu w Haskellu
  17. Programowanie piśmienne w wikipedii
  18. Using GHCi doc
  19. Stackoverflow question: cabal-run-gives-unrecognised-command-run