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

Z Wikibooks, biblioteki wolnych podręczników.
Usunięta treść Dodana treść
literówki, linki, interpunkcja, formatowanie
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]


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

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ż

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