+ All Categories
Home > Documents > Programovac í jazyk Haskell

Programovac í jazyk Haskell

Date post: 07-Jan-2016
Category:
Upload: nona
View: 36 times
Download: 1 times
Share this document with a friend
Description:
Programovac í jazyk Haskell. Ing. Lum ír Návrat  katedra informatiky, A 1018  59 732 3252. Historie. z áří 1991 – Gofer experimentální jazyk Mark P. Jones únor 1995 – Hugs Hugs98 téměř úplná implementace jazyka Haskell 98 některá rozšíření navíc. Instalace + dokumentace. - PowerPoint PPT Presentation
23
Programovací jazyk Haskell Ing. Lumír Návrat katedra informatiky, A 1018 59 732 3252
Transcript
Page 1: Programovac í jazyk Haskell

Programovací jazykHaskell

Ing. Lumír Návrat

katedra informatiky, A 1018

59 732 3252

Page 2: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 2

Historie

září 1991 – Gofer experimentální jazyk Mark P. Jones

únor 1995 – Hugs Hugs98

téměř úplná implementace jazyka Haskell 98 některá rozšíření navíc

Page 3: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 3

Instalace + dokumentace

Základní zdroje http://haskell.org

popis jazyka a knihoven http://haskell.org/hugs

instalace (Win / Unix) uživatelská příručka (je součástí instalace)

Další součásti School of Expression (SOE) Hugs Graphics Library

Page 4: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 4

Použití Princip výpočtu: kalkulátor

$ hugsPrelude> 2*(3+5)16Prelude> cos 01.0Prelude>

Skript: definice uživatelských funkcí

$ hugs priklad.hs

Page 5: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 5

Řídicí příkazy

Editace souboru:edit [soubor.hs] :e

Načtení skriptu:load [soubor.hs] :reload

Ukončení:quit

Nápověda:?

Unix – nastavení editoru v souboru ~/.profileexport HUGSFLAGS="-E\"vi +%d %s\" +t +s -u"

Page 6: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 6

Skript priklad.hs

module Priklad where-- funkce, která vrací součet dvou číselsoucet x y = x + y

priklad.lhs> module Priklad where

Funkce, která vrací faktoriál čísla

> f n = if n == 0 then 1 else n * f (n-1)

Page 7: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 7

Datové typy Základní datové typy

1::Int ‘a’::Char True,False::Bool 3.14::Float

Seznamy [a] prázdný seznam [] neprázdný seznam (x:xs) 1:2:3:[] :: [Int] [1,2,3] :: [Int]

Page 8: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 8

Datové typy Uspořádané n-tice (a,b,c,...)

(1,2) :: (Int,Int) (1,['a','b'])::(Int, [Char]) () :: ()

Funkce a->b faktorial :: Int -> Int soucet :: Int -> Int -> Int plus :: (Int, Int) -> Int

Page 9: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 9

Datové typy Uživatelské datové typy

data Barva = Cerna | Bila

data Tree a = Leaf a | Node a (Tree a) (Tree a)

type String = [Char]

type Tabulka a = [(String, a)]

Page 10: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 10

Definice funkcí Rovnice a unifikace vzorů

(pattern matching): f pat11 pat12 ... = rhs1 f pat21 pat22 ... = rhs2 ...

Vybere se první rovnice vyhovující parametrům

Pokud se nenajde chyba

Page 11: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 11

Vzory

proměnná inc x = x + 1

konstanta not True = False not False = True

seznam length [] = 0 length (x:xs) = 1 + length xs

Page 12: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 12

Vzory n-tice

plus (x,y) = x+y

konstruktor uživatelského typu nl (Leaf _) = 1 nl (Tree _ l r) = (nl l) + (nl r)

pojmenování části vzoru duphd p@(x:xs) = x:p

Page 13: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 13

Vzory anonymní proměnná _

hd (x:_) = x

vzor typu n+k fact 0 = 1 fact (n+1) = (n+1)*fact n

strážené rovnice fact n | n == 0 = 1 | otherwise = n * fact(n-1)

Page 14: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 14

Příklady Faktoriál

fakt1 n = if n == 0 then 1 else n * fakt1 (n-1)

fakt2 0 = 1fakt2 n = n * fakt2 (n-1)

fakt3 0 = 1fakt3 (n+1) = (n+1) * fakt3 n

fakt4 n | n == 0 = 1 | otherwise = n * fakt4 (n-1)

Page 15: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 15

Příklady

Fibonacciho čísla

fib :: Int -> Intfib 0 = 0fib 1 = 1 fib (n+2) = fib n + fib (n+1)

Page 16: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 16

Příklady

Délka seznamu length [] = 0

length (x:xs) = 1 + length xs

Poznámka: pozor na konflikt s předdefinovanými funkcemi! module Pokus where

import Prelude hiding(length)

length [] = 0length (_:xs) = 1 + length xs

Page 17: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 17

Lokální definice

Konstrukce let ... in f x y = let p = x + y q = x – y in p * q

Konstrukce where f x y = p * q where p = x + y q = x - y

Page 18: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 18

Částeční aplikace funkcí Curryho tvar funkce

add :: Int -> Int -> Intadd x y = x + y

plus :: (Int, Int) -> Intplus (x,y) = x + y

add = curry plus curry :: ? plus = uncurry add uncurry :: ?

Řezy funkce inc x = 1 + x inc x = add 1 x inc = add 1 inc = (+1) = (1+) add = (+)

Page 19: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 19

Příklady

Vytvoření seznamu druhých mocnin dm [] = []dm (x:xs) = sq x : dm xs where sq x = x * x

Seřazení seznamu (quicksort) qs [] = []qs (x:xs) = let ls = filter (< x) xs rs = filter (>=x) xs in qs ls ++ [x] ++ qs rs

Page 20: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 20

Funkce pro seznamy

Přístup k prvkům seznamu head [1,2,3] = 1 tail [1,2,3] = [2,3] last [1,2,3] = 3 init [1,2,3] = [1,2] [1,2,3] !! 2 = 3 null [] = True length [1,2,3] = 3

Page 21: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 21

Funkce pro seznamy Spojení seznamů

[1,2,3] ++ [4,5] = [1,2,3,4,5] [[1,2],[3],[4,5]] = [1,2,3,4,5] zip [1,2] [3,4,5] = [(1,3),(2,4)] zipWith (+) [1,2] [3,4] = [4,6]

Agregační funkce sum [1,2,3,4] = 10 product [1,2,3,4] = 24 minimum [1,2,3,4] = 1 maximum [1,2,3,4] = 4

Page 22: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 22

Funkce pro seznamy

Výběr části seznamu take 3 [1,2,3,4,5] = [1,2,3] drop 3 [1,2,3,4,5] = [4,5] takeWhile (>0) [1,3,0,4] = [1,3] dropWhile (> 0) [1,3,0,4] = [0,4] filter (>0) [1,3,0,2,-1] = [1,3,2]

Transformace seznamu reverse [1,2,3,4] = [4,3,2,1] map (*2) [1,2,3] = [2,4,6]

Page 23: Programovac í jazyk Haskell

FLP - Programovací jazyk Haskell 23

Úkol Pokuste se uvedené funkce pro seznamy

implementovat co je triviální případ?

length [] = 0 maximum [x] = x

funkci umím udělat s kratším seznamem -> jak tuto hodnotu zkombinuji s prvním prvkem seznamu, abych dostal výsledek? maximum (x:y:ys) | x > y = maximum (x:ys) | otherwise = maximum (y:ys)


Recommended