Programowanie w systemie UNIX/Haskell: Różnice pomiędzy wersjami
m →Cechy Haskella: [ nie [[ |
→Cechy Haskella: int., ort., lit. |
||
Linia 9: | Linia 9: | ||
=Cechy Haskella = |
=Cechy Haskella = |
||
* jest to język czysto funkcyjny |
* jest to język czysto funkcyjny: |
||
** nie ma zmiennych w znaczenie pojemników na wartości jak |
** nie ma zmiennych w znaczenie 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 |
* 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 ( |
* 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 |
|||
* Polimorfizm |
|||
* |
* klasy typów |
||
* |
* monady |
||
=Instalacja= |
=Instalacja= |
Wersja z 18:24, 29 cze 2013
"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 kategorii.[2]
Cechy Haskella
- jest to język czysto funkcyjny:
- nie ma zmiennych w znaczenie 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)[3]
- 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 [4]
Przykłady
Funkcje
Przykład[5]
Haskellsquare :: Int -> Int square n = n*n |
Cint square(int n) {
return n*n; }
|
Listy
Listy skończone [6]
sum [1..10]
product [1..10]
Listy nieskończone :
[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 roszerzeniem 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[7]
Pakiet
Pakiet zawsze zawiera : [8]
- 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 [9]
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 [10]
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 :[11]
- jednego głównego pakietu o ( main)
- jednego głównego modułu (Main)
- jednej głównej funkcji ( main). [12][13]
-- 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 sam jak nazwa modułu.
Program kompilujemy :
ghc -o w w.hs
i uruchomiamy :
./w
Pierwszy projekt
Projekt [14]
hsl
Pliki z rozszerzeniem hsl zawierając kod w stylu programowania piśmiennego ( ang. literate programming) [15]
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 [16])
Zobacz również
- Marcin Szlenk - progrmowanie w języku Haskell i funkcyjne
- | Haskell - Tomek „QsoRiX” Rydzynski
- | Programowanie funkcyjne - Marcin Kubica
Odnośniki
- ↑ EPIGRAMS IN PROGRAMMING
- ↑ Teoria kategorii
- ↑ 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
- ↑ 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