Haskell forts. 5DV085 - Programspråk. Jan Erik Moström, Department of Computing Science, Umeå University - jem@cs.umu.se

Relevanta dokument
Lite skoj - typ. 5DV085 - Programspråk. Jan Erik Moström, Department of Computing Science, Umeå University - jem@cs.umu.se

Föreläsning 7 i programmeringsparadigm. Ytterligare Högre ordningens funktioner: filter, foldr foldl. Hutton 7.2, 7.3 och 7.4.

Kungliga Tekniska Högskolan Ämneskod 2D1370 Tentamensdag 2001-maj-31 Tentamen i Funktionell Programmering Skrivtid 4 h

Funktionell programmering DD1361

DD1361 Programmeringsparadigm. Carina Edlund

Repetition av OOP- och Javabegrepp

Repetition av OOP- och Javabegrepp

Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar.

Föreläsning Datastrukturer (DAT036)

Tentamensdag 2002-aug-20 Tentamen i Funktionell Programmering Skrivtid 5 h

Paket (2) nautisk_mil : constant Float := * foot; ångström : constant Float := 10.0E-10; mile : constant Float := 5280.

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

Datastrukturer i Haskell

Introduktion till Haskell

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Nada Tentamensdag 2004 okt 18 Tentamen Programmeringsparadigm Skrivtid 5 h

Introduktion till programmering. Standardfunktioner. Vad används datorer till? Standardfunktioner. Föreläsning 2. Prelude. $ ghci...

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 7. Träd och binära sökträd

Sista delen av kursen

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Deklarationer/definitioner/specifikationer

Classes och Interfaces, Objects och References, Initialization

12/31/ /03/2019

Sista delen av kursen

Programspråkslingvistik. Sista delen av kursen. Ett programspråk

Se utdraget ur "AGentle Introduktion.." Appendix (bihang) till Hutton.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 1 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Omgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem.

Föreläsning 4 i programmeringsparadigm.

SMD 134 Objektorienterad programmering

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Tvådimensionella fält

Föreläsning Datastrukturer (DAT036)

TDDE10 TDDE11, 725G90. Gemensam kurswebsida på:

Nada, KTH Tentamensdag maj -24 Tentamen i Funktionell Programmering Skrivtid 5 h

I kapitel 15 gör Hudak för reaktiva animeringar detsamma som han i kapitel 13 gör för animeringar. Resultatet är en module Fal.

Programmering A. Johan Eliasson

Föreläsning 3 i Programmeringsparadigm

En dröm för vår skola blir sann! Elevresa till Kina 3/4-17/4 2015

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Klassdeklaration. Metoddeklaration. Parameteröverföring

Evodev AB web epost Telefon Fax

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Mer grafik. Jan Erik Moström

Objektorienterad Programmering DAT043

PROMETHEUS. Ett typat, objektorienterat programmeringsspråk av Tim Andersson.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Programmering, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

TDIU01 - Programmering i C++, grundkurs

Visual Basic, en snabbgenomgång

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Det finns många flaggor till g++,

Övning2. Variabler. Data typer

OOP Objekt-orienterad programmering

Pascal... Pascal. Pascal... Pascal...

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Juniorer Föreläsning på SM-förberedande lägret i Göteborg SM-förberedande läger igöteborg 2013

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Generiska konstruktioner. Kursbokens kapitel 13

Funktionell programmering. Haskell. Ge#ng started...

Tillämpad programmering

Grundläggande databehandling ht 2005

Men först: Några funktioner ur preluden. Introduktion till programmering. Uppgiften. Variationer av uppgiften. Föreläsning 4

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Racetracks in upperase are Swedish Racetracks

Grundläggande Datalogi

Karlstads Universitet, Datavetenskap 1

Föreläsning 8. Hudak kapitel 13. 2D1370 Funktionell programmering v15 torsdag

Objektorienterad programmering

Föreläsning 8. Paradigmöversikt, paradigmhistoria, paradigmgeografi. Se även föreläsning 1.

Datastrukturer. Erik Forslin. Rum 1445, plan 4 på Nada

Ulf Assarsson. Grundläggande C-programmering del 3. Läromoment: Grundläggande C-programmering del 3

Föreläsning 7. Träd och binära sökträd

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

Föreläsning 4 (och 5?) i programmeringsparadigm.

Föreläsning 8 Flerdimensionella fält ArrayList enum switch-satsen

Lösningsförslag till exempeltenta 1

Översikt MERA JAVA OCH ECLIPSE. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Digitalitet. Kontinuerlig. Direkt proportionerlig mot källan. Ex. sprittermometer. Elektrisk signal som representerar ljud.

Nada KTH 2003 okt 23 Tentamen Programmeringsparadigm 2D1350 Skrivtid 5 h 8-13

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse

TDIU01 - Programmering i C++, grundkurs

F4. programmeringsteknik och Matlab

Variabler, värden och typer

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

TDIU01 Programmering i C++

BRÖDGRUPPENS HEMSIDA

Transkript:

Haskell forts 5DV085 - Programspråk, Department of Computing Science, Umeå University - jem@cs.umu.se

Moduler Grupp 1, Department of Computing Science, Umeå University - jem@cs.umu.se

Function application operator $ Normalt så är f a b c d samma som (((f a) b) c) d Men f $ a b c d blir f (((a b) c) d)

Function composition Sätta ihop två funktioner - dvs ut från en funktion är in till en annan. Om vi har a. b så betyder det egentligen a (b x) Om vi tittar på typsignaturen (b -> c) -> (a -> b) -> a -> c Exempel map (\xs -> negate (sum (tail xs))) [[1..5],[3..6],[1..7]] [-14,-15,-27] map (negate. sum. tail) [[1..5],[3..6],[1..7]]

Datatyper en start Det är naturligtvis möjligt att definiera egna datatyper data Bodies = Sphere Float Box Float Float Float > let z = Box 5 2 3 > z <interactive>:1:0: No instance for (Show Bodies)... data Bodies = Sphere Float Box Float Float Float! deriving (Show) > z Box 5.0 2.0 3.0

Datatyper en start surface (Sphere r) = 4 * pi * r^2 surface (Box b d h) = 2 * (b*d + b*h + d*h) volume (Sphere r) = 4 * pi * r^3 / 3 volume (Box b d h) = b * d * h > surface z 62.0 > volume z 30.0

Datatyper en start surface (Sphere r) = 4 * pi * r^2 surface (Box b d h) = 2 * (b*d + b*h + d*h) volume (Sphere r) = 4 * pi * r^3 / 3 volume (Box b d h) = b * d * h > surface z 62.0 > volume z 30.0

Konstruktorerna är funktioner! > map (Box 4 5) [1..5] [Box 4.0 5.0 1.0, Box 4.0 5.0 2.0, Box 4.0 5.0 3.0, Box 4.0 5.0 4.0, Box 4.0 5.0 5.0]

Egna datatyper i egen definition Det är naturligtvis möjligt att använda egendefinierade datatyper när jag definierar nya data Point3D = Point3D Float Float Float deriving (Show) data Bodies = Sphere Float Point3D Box Float Float Float Point3D deriving (Show) > let curpos = Point3D 20 10 12 > let sph = Sphere 12 curpos > sph Sphere 12.0 (Point3D 20.0 10.0 12.0) surface (Sphere r _) = 4 * pi * r--2 surface (Box b d h _) = 2 * (b*d + b*h + d*h) distance (Point3D x y z) = sqrt(x^2+y^2+z^2) bodydistance (Sphere _ p) = distance(p) bodydistance (Box _ p) = distance(p) > bodydistance sph 25.377155

Records Det blir lite bökigt att i längden hålla reda på positionen för olika delar av definitionen data Point3D = Point3D{! xcoord::float,! ycoord::float,! zcoord::float}! deriving (Show) > let curpos = Point3D 20 10 12 > curpos Point3D {xcoord = 20.0, ycoord = 10.0, zcoord = 12.0} > ycoord curpos 10.0 > zcoord curpos 12.0

data Bodies = Sphere { radius::float, position::point3d } Box { width::float, depth::float, height::float, position::point3d } distance (Point3D x y z) = sqrt(x^2+y^2+z^2) bodydistance (Sphere _ p) = distance(p) bodydistance (Box _ p) = distance(p)

Type parameters Istället för att definiera en datatyp med en specifik typ så kan jag välja att definiera en mer generell variant (exempel från boken) data Maybe a = Nothing Just a > Just 5 Just 5 > :t Just 5 Just 5 :: (Num t) => Maybe t > :t Just 5.0 Just 5.0 :: (Fractional t) => Maybe t > :t Just (5.0::Float) Just (5.0::Float) :: Maybe Float > :t Just "Hello" Just "Hello" :: Maybe [Char]

data Car = Car { company :: String, model :: String, year :: Int } deriving (Show) data Car a b c = Car { company :: a, model :: b, data Car a b c = Car { year :: c company :: String, } deriving (Show) model :: String, year :: c } deriving (Show) tellcar (Car {company = c, model = m, year = y}) =! "This " ++ c ++ " " ++ m ++ " was made " ++ show y > let car1 = Car "Volvo" "Amazon" 1964 > :t car1 car1 :: Car a b Integer > tellcar car1 "This Volvo Amazon was made 1964" > let car2 = Car "Volvo" "PV444" "ca 1955" > tellcar car2 "This Volvo PV444 was made "ca 1955""

Derived instances Type classes definierar något slags beteende Hur kan man få en klass att få ett beteende data Person = Person{ firstname :: String, lastname :: String, age :: Int } deriving (Eq) > let a = Person "Kalle" "Anka" 62 > let b = Person "Knatte" "Anka" 41 > a == b False > let c = Person "Kalle" "Anka" 62 > a == c True Funkar även för show och read

Ordnade datatyper data Day = Monday Tuesday Wednesday Thursday Friday Saturday Sunday data Day = Monday Tuesday Wednesday Thursday Friday Saturday Sunday deriving (Eq, Ord, Show, Read, Bounded, Enum) > Saturday == Sunday False > Saturday == Saturday True > Saturday > Friday True > Monday `compare` Wednesday LT > succ Monday Tuesday > [Thursday.. Sunday] [Thursday,Friday,Saturday,Sunday]

Synonymer För att göra det enklare att läsa koden. alias för olika typer type String = [Char] Exempel på hur man kan utnyttja det (från boken)

phonebook :: [(String, String)] phonebook = [("betty", "555-2938"),("bonnie", "452-2928"),("patsy", "493-2928"),("lucille", "205-2928"),("wendy", "939-8282"),("penny", "853-2492") ] type PhoneNumber = String type Name = String type PhoneBook = [(Name, PhoneNumber)] inphonebook :: Name -> PhoneNumber -> PhoneBook -> Bool inphonebook name pnumber pbook = (name, pnumber) `elem` pbook inphonebook :: String -> String -> [(String, String)] -> Bool

Rekursiva datatyper Datatyper som är definierade i sig själva är inget nytt. Tar samma exempel som boken Ett sätt att se på listor är en array (vilket inte är en lista), dvs traditionellt en minnesutrymme indelat i fack som man kan adressera En vidare utveckling i detta tankesätt är listor. Dessa kan man endera se som dynamiska arrayer (inget bra sätt) eller på ett mer abstrakt sätt

Listor är rekursiva I Haskell (och många andra språk) så är det möjligt att definiera rekursiva datatyper Basfallet: Tom lista Annars: Ett huvud och en lista Med andra ord:

data MinLista a = Tom Ihop a (MinLista a) deriving (Show, Read, Eq, Ord) > let a = Tom > :t a a :: MinLista a > let b = 118 `Ihop` a > b Ihop 118 Tom > :t b b :: MinLista Integer > let c = 42 `Ihop` b > c Ihop 42 (Ihop 118 Tom) > :t c c :: MinLista Integer

Definiera infix operatorer infixr 5 :-: data MinLista a = Tom a :-: (MinLista a) deriving (Show, Read, Eq, Ord) > let c = 42 :-: 118 :-: Tom > c 42 :-: (118 :-: Tom) infix 5 ^++ (^++) :: MinLista a -> MinLista a -> MinLista a Tom ^++ bl = bl (a :-: al) ^++ bl = a :-: (al ^++ bl) > let d = 1 :-: 2 :-: Tom > let e = c ^++ d > e 42 :-: (118 :-: (1 :-: (2 :-: Tom)))

Träd är också rekursiva data Tree a = EmptyTree Node a (Tree a) (Tree a) deriving (Show) treeinsert::(ord a) => a -> Tree a -> Tree a treeinsert aval EmptyTree = Node aval EmptyTree EmptyTree treeinsert aval (Node bval ltree rtree) aval > bval = Node bval ltree (treeinsert aval rtree) otherwise = Node bval (treeinsert aval ltree) rtree > let a = treeinsert 12 EmptyTree > a Node 12 EmptyTree EmptyTree > let b = treeinsert 6 a > b Node 12 (Node 6 EmptyTree EmptyTree) EmptyTree > let c = treeinsert 24 b > let d = treeinsert 114 c > d Node 12 (Node 6 EmptyTree EmptyTree) (Node 24 EmptyTree (Node 114 EmptyTree EmptyTree)) > let e = treeinsert 24 d > e Node 12 (Node 6 EmptyTree EmptyTree) (Node 24 (Node 24 EmptyTree EmptyTree) (Node 114 EmptyTree EmptyTree))