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

literówki, linki, interpunkcja, formatowanie
(→‎cabal: unrecognised command: sandbox (try --help): export PATH="$HOME/.cabal/bin:${PATH}")
(literówki, linki, interpunkcja, formatowanie)
[[Haskell]] zmieni twój sposób myślenia o programowaniu (:-))
 
Wykorzystuje teorię[[W:Teoria kategorii|teorię kategorii]].<ref>[[w:Teoria kategorii|Teoria kategorii]]</ref>
 
=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>
** nie ma zmiennych w znaczenieznaczeniu 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)<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ń.
* polimorfizm
* klasy typów
* z użyciem standardowych instalatorów (stabilna, ale zwykle nie najnowsza wersja), np.:
** Centrum Oprogramowania Ubuntu
** Menadżer Pakietów SYnapticSynaptic
* 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>
 
product [1..10]
 
Listy nieskończone ( przykład [[Haskell#Leniwe_warto.C5.9Bciowanie|leniwego wartościowaniewartoś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..]
==Wejście i wyjście ==
 
Wczytywanie argumentów :
-- http://zvon.org/other/haskell/Outputsystem/getArgs_f.html
-- save it as a file a.hs
print x
 
Wczytywanie pliku tekstowego, którego nazwa jest podana jako argument programu :
 
-- save it as a file f.hs
==hs==
 
Pliki z roszerzeniemrozszerzeniem ''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
Nazwa modułu odpowiada nazwie pliku, z wyjątkiem modułu głównego.
 
Standardowe moduły :
* Prelude<ref>[http://www.haskell.org/onlinereport/standard-prelude.html Moduł Prelude]</ref>
 
===Pakiet===
 
Pakiet '''zawsze zawiera''' : <ref>[http://www.haskell.org/cabal/proposal/x138.html System pakietów Haskella]</ref>
* 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''' <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 '':
 
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źródłowego (skompresowanego w plikach tar-ball, zip )
* plikach binarnych
* specjalnych postaciach : RPM, pakiety Debiana, windows <ref>[http://www.haskell.org/cabal/proposal/x138.html Pakiety w Haskellu]</ref>
 
===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 :<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 modułu (Main)
* jednej głównej funkcji ( main). <ref>[[:enwikibooks:Haskell/YAHT/Language_basics#Source_Code_Files | Pliki z kodem żródłowymźródłowym w ang podręczniku]]</ref><ref>[[:enwikibooks:wikibooks:Haskell/Applications| Aplikacja Haskella w ang wikibooks]]</ref>
 
-- moduł główny Main
main = putStrLn "Hello world"
 
Program zapisujemy do pliku, np. <code>w.hs</code>
 
Jak widać nazwa pliku zawierającego moduł główny nie musi być taka samsama jak nazwa modułu.
 
 
Program kompilujemy :
ghc -o w w.hs
 
i uruchomiamy :
./w
 
==hsl==
 
Pliki z rozszerzeniem hsl zawierajączawierają kod w stylu programowania piśmiennego ( ang. literate programming) <ref>[[w:Literate programming | Programowanie piśmienne w wikipedii]]</ref>
 
=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'' <ref>[http://www.haskell.org/ghc/docs/latest/html/users_guide/interactive-evaluation.html#ghci-scope Using GHCi doc]</ref>)
 
=Problemy=
==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>
Sprawdzamy :
 
cabal -V
 
przykłądowyprzykł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ż=
* [http://www.ia.pw.edu.pl/~mszlenk/ Marcin Szlenk - progrmowanieprogramowanie w języku Haskell i funkcyjne]
* [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 ]
 
=Odnośniki=