Programowanie w systemie UNIX/Haskell: Różnice pomiędzy wersjami
literówki, linki, interpunkcja, formatowanie |
m →ghc: v |
||
Linia 214: | Linia 214: | ||
potem uruchamiamy wykonywalny plik: |
potem uruchamiamy wykonywalny plik: |
||
./m |
./m |
||
Sprawdzamy wersję i zainstalowane moduły: |
|||
ghc -v |
|||
przykładowy wynik : |
|||
<pre> |
|||
Glasgow Haskell Compiler, Version 7.10.3, stage 2 booted by GHC version 7.10.3 |
|||
Using binary package database: /usr/lib/ghc/package.conf.d/package.cache |
|||
wired-in package ghc-prim mapped to ghc-prim-0.4.0.0-6cdc86811872333585fa98756aa7c51e |
|||
wired-in package integer-gmp mapped to integer-gmp-1.0.0.0-3c8c40657a9870f5c33be17496806d8d |
|||
wired-in package base mapped to base-4.8.2.0-0d6d1084fbc041e1cded9228e80e264d |
|||
wired-in package rts mapped to builtin_rts |
|||
wired-in package template-haskell mapped to template-haskell-2.10.0.0-3c4cb52230f347282af9b2817f013181 |
|||
wired-in package ghc mapped to ghc-7.10.3-624693c6aa854116c707bc7b4d0d7cb6 |
|||
wired-in package dph-seq not found. |
|||
wired-in package dph-par not found. |
|||
Hsc static flags: |
|||
*** Deleting temp files: |
|||
Deleting: |
|||
*** Deleting temp dirs: |
|||
Deleting: |
|||
ghc: no input files |
|||
Usage: For basic information, try the `--help' option. |
|||
</pre> |
|||
==ghci== |
==ghci== |
Wersja z 11:33, 25 gru 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
Sprawdzamy wersję i zainstalowane moduły:
ghc -v
przykładowy wynik :
Glasgow Haskell Compiler, Version 7.10.3, stage 2 booted by GHC version 7.10.3 Using binary package database: /usr/lib/ghc/package.conf.d/package.cache wired-in package ghc-prim mapped to ghc-prim-0.4.0.0-6cdc86811872333585fa98756aa7c51e wired-in package integer-gmp mapped to integer-gmp-1.0.0.0-3c8c40657a9870f5c33be17496806d8d wired-in package base mapped to base-4.8.2.0-0d6d1084fbc041e1cded9228e80e264d wired-in package rts mapped to builtin_rts wired-in package template-haskell mapped to template-haskell-2.10.0.0-3c4cb52230f347282af9b2817f013181 wired-in package ghc mapped to ghc-7.10.3-624693c6aa854116c707bc7b4d0d7cb6 wired-in package dph-seq not found. wired-in package dph-par not found. Hsc static flags: *** Deleting temp files: Deleting: *** Deleting temp dirs: Deleting: ghc: no input files Usage: For basic information, try the `--help' option.
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