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



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

Syftet med en personlig handlingsplan

Föreläsning 5: Rekursion

Idag: Dataabstraktion

Lathund, procent med bråk, åk 8

Rekursion: varför? Problem delas upp i mindre bitar algoritm för att lösa problemet erhålls från problemformuleringen

Läraren som moderator vid problemlösning i matematik

Mera om generik. Innehåll. Generik och arv Wildcards Vektorer och generik Generiska metoder. EDA690 (Mera om generik) HT / 24

Gemensam problemlösning. Per Berggren och Maria Lindroth

729G04 - Hemuppgift, Diskret matematik

Programmera en NXT Robot

Gissa det hemliga talet

08/11/13. Databasteknik och informationssystem DD1370 F3. Ett urval ur databasen bestäms av en SQL-fråga. Påminnelse: Deadline på tisdag

Boken om Teknik. Boken om Teknik är en grundbok i Teknik för åk 4 6.

Identiteter och behörigheter i molnet och BYOD

912 Läsförståelse och matematik behöver man lära sig läsa matematik?

1 Modul 2 ADTer. 1.1 Definition

Du ska nu skapa ett litet program som skriver ut Hello World.

Individuellt Mjukvaruutvecklingsprojekt

Lösningar s. 8 Perspek9v s. 7

VÄRDERINGSÖVNINGAR. Vad är Svenskt?

PARTIDEBATT. Material:

ELEV- HANDLEDNING (Ansökan via webben)

Predikat = Vad händer? Vad gör någon eller något? Tänk på att är och har också är predikat

Modul 6: Integraler och tillämpningar

Träning i bevisföring

Introduktion. Den objektorienterade modellen Grundläggande begrepp Klass Klassen som abstraktion

Tentamen i Programmering grundkurs och Programmering C

a n = A2 n + B4 n. { 2 = A + B 6 = 2A + 4B, S(5, 2) = S(4, 1) + 2S(4, 2) = 1 + 2(S(3, 1) + 2S(3, 2)) = 3 + 4(S(2, 1) + 2S(2, 2)) = = 15.

Text och bilder gjorda av Rickard Johansson, TE14A Realgymnasiet.

Föreläsning Datastrukturer (DAT036)

Har vi lösningen för en bättre hemtjänst? Självklart.

FINLAND I EUROPA 2008

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

Kampanj kommer från det franska ordet campagne och innebär att man under en tidsbegränsad period bedriver en viss verksamhet.

Fullför installation av ELIQ

Omvandla Vinklar. 1 Mattematiskt Tankesätt

Din första arbetsdag

Svenska Du kan med flyt läsa texter som handlar om saker du känner till. Du använder metoder som fungerar. Du kan förstå vad du läser.

Väga paket och jämföra priser

Laborativ matematik som bedömningsform. Per Berggren och Maria Lindroth

En tredjedel av medborgarna i norra Sverige vill ha nya regioner men många är skeptiska

Anhörigas upplevelser av en hjärtstoppssituation och att själv bli omhändertagen ett vårdande förhållningssätt inom ambulanssjukvård

4-3 Vinklar Namn: Inledning. Vad är en vinkel?

Sammanfatta era aktiviteter och effekten av dem i rutorna under punkt 1 på arbetsbladet.

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

PROGRAMMERING A VB6 UTVECKLINGSVERKTYGET VISUAL BASIC

Vad är det att vara en bra brandman? Vad kan man då?

Visualisering av golfboende

TIMREDOVISNINGSSYSTEM

Mål Blå kurs Röd kurs

konstanterna a och b så att ekvationssystemet x 2y = 1 2x + ay = b 2 a b

Webb-bidrag. Sök bidrag på webben Gäller från

Enkätresultat för elever i år 2 i Nösnäsgymnasiet 2 i Stenungsund våren 2014

Intervju med Årets teknikkvinna 2011 Anna Pernestål

Vi skall skriva uppsats

7. SAMHÄLLSORIENTERING ÅK 5

Enkätresultat för elever i år 2 i Mega Musik gymnasium hösten Antal elever: 47 Antal svarande: 46 Svarsfrekvens: 98% Klasser: MM13

Enkätresultat för elever i år 2 i Praktiska Skövde i Praktiska Sverige AB hösten 2014

Hur gör jag så att patienten blir delaktig, i samtalet, för att hitta lösningar vid förskrivning av hjälpmedel?

Utbildningsmodulen i IdrottOnline-appen

Vet du vilka rättigheter du har?

Axiell Arena. Samarbeta om bilder Regionbiblioteket i Kalmar län

Manual HSB Webb brf

Manual fö r kursspecifika ansö kningsförmula r Fölkhö gsköla.nu

UPPGIFT: SKRIV EN DEBATTARTIKEL

P-02/03 säsongen 2016

QFD. Quality Function Deployment Boris Mrden Tobias Lindström Arefeh Mirzaie Shra Morin Habib David Bizzozero

Kapitel 6. f(x) = sin x. Figur 6.1: Funktionen sin x. 1 Oinas-Kukkonen m.fl. Kurs 6 kapitel 1

Antal grodor i varje familj Antal hopp tills alla bytt plats Ökning

Varför är det så viktigt hur vi bedömer?! Christian Lundahl!

Instruktioner för beställning och kontoadministration för abonnenter av inlästa läromedel

Guide för att hitta markavvattningssamfälligheter och täckdikningsplaner

Matriks Automate 1.4 Praktiska exempel. Navision / Microsoft Dynamics NAV. Hur det funkar i verkligheten. Joakim Hansson

Måttbandet nr 143 januari 2007

Jämförelse länder - Seminarium

Det flippade klassrummet hur uppfattas det av eleverna?

Skriva B gammalt nationellt prov

Hej! Mitt namn är Agota, och jag ringer från Smittskyddsinstitutet angående en telefonintervju om ditt deltagande i Sjukrapport. Pratar jag med XX?

När jag har arbetat klart med det här området ska jag:

Bortom fagert tal om bristande tillgänglighet som diskriminering

Rapport uppdrag. Advisory board

Single sourcing Bra eller dåligt?

Föreläsning: Konflikthantering i en BRF. Fastighetsägarna Stockholm, Fastighetsägarnas Hus

Säkerhet. De onda. Vilka är farorna?

Uppdrag: Huset. Fundera på: Vilka delar i ditt hus samverkar för att elen ska fungera?

Stimulated recall En forskningsmetod

Fakta och förhållningssätt för professionella som möter utsatta barn

EN BÄTTRE KREDITAFFÄR

Vi vänder på upplägget och låter deltagarna presentera input från föräldramöten etc.

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

DEMOKRATI 3 DEMOKRATINS VILLKOR

1. Hur många timmar per vecka har du i genomsnitt lagt ner på kursen (inklusive schemalagd tid)?

Handledning för digitala verktyg Talsyntes och rättstavningsprogram. Vital, StavaRex och SpellRight

Föreläsning 8: Räkning. Duvhålsprincipen. Kombinatorik

Kvinnor som driver företag pensionssparar mindre än män

Utbildningsplan för arrangörer

Gruppenkät. Lycka till! Kommun: Stadsdel: (Gäller endast Göteborg)

INTERVJU MED TOMI SÖDERSTRÖM, PRODUKTCHEF / MAT- & RESTAURANGSERVICE, SILJA LINE , HELSINGFORS

Två konstiga klockor

Transkript:

Lite skoj - typ 5DV085 - Programspråk, Department of Computing Science, Umeå University - jem@cs.umu.se

Kommentarer och frågor på sem 1?

Byte av tid Den 26:e - skulle vi kunna flytta den lektionen? Förmiddagen?

Istället för deriving Mer kontroll än deriving vore trevligt Anta data Person = Person{ first::string, last ::String, queuenr :: Int } För att kunna jämföra data Person = Person{ first::string, last ::String, queuenr :: Int } deriving (Eq) Men queuenr är ointressant för jämförelse

a = Person "Kalle" "Anka" 12 b = Person "Knatte" "Anka" 13 c = Person "Kalle" "Anka" 14 > a == b False > a == c False Det är alltså bra om man kan definiera hur t.ex. jämförelse ska ske

Definitionen av typklassen Eq class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool x == y = not (x /= y) x /= y = not (x == y) Tänk interface i Java - definition av hur en typ ska uppföra sig, inte själva implementationen. Notera att typen är en parameter Jämförelsen är definierad i sig själv För att få vad jag vill i Person måste jag definiera hur en instans av Eq ser ut för Person

Definiera en instans av Eq för Person instance Eq Person where (Person f1 l1 _) /= (Person f2 l2 _) = f1 /= f2 l1 /= l2 Det är allt == behöver inte definieras eftersom == och /= är definierade i varandra a = Person "Kalle" "Anka" 12 b = Person "Knatte" "Anka" 13 c = Person "Kalle" "Anka" 14 > a == b False > a == c True

Kan också definiera om Show > a Person {first = "Kalle", last = "Anka", queuenr = 12} instance Show Person where show (Person f l q ) = f ++ " " ++ l ++ " in pos " ++ show q > a Kalle Anka in pos 12 > b Knatte Anka in pos 13 > c Kalle Anka in pos 14

Er tur För att kunna jämföra värden så finns funktionen compare definierad för typklassen Ord. Den har signaturen compare :: (Ord a) => a -> a -> Ordering data Ordering = LT EQ GT deriving (Eq, Ord, Bounded, Enum, Read, Show) Definiera en instans av Ord för Person där man jämför baserat på först efternamn och sedan förnamn. Könummer är ointressant > a `compare` b LT > b `compare` a GT > a `compare` c EQ

Möjlig lösning instance Ord Person where compare (Person f1 l1 _ ) (Person f2 l2 _ ) l1 < l2 = LT l1 > l2 = GT f1 < f2 = LT f1 > f2 = GT otherwise = EQ

Subklasser class (Eq a) => Num a where Definition av typklassen Num, där det är ett krav att a implementerar typklassen Eq Dvs det är inget subklassning som vi är vana att tänka utan bara en restriktion på vilken typklass a måste vara

Typen kan vara en typvariabel instance (Eq m) => Eq (Maybe m) where Just x == Just y = x == y Nothing == Nothing = True _ == _ = False Maybe är ju inte någon konkret typ men kan användas som typvariabel Tolkning: Definition av hur jämförelse ska ske för Maybedatatyper Ett krav är att m måste ha jämförelse definierad

Ett steg tillbaka Vad handlar programmering om? Detta är min åsikt Problemlösning Identifiera problemet Lösa problemet Söndra och härska Skriva ner lösningen Abstraktion Många olika sätt Instruktioner - Assembler, högnivåspråk, etc Data - structs, listor, stackar, objekt etc Kod - procedurer, moduler, klasser, paket Vad kod gör - tänk på map, foldr/foldl

Functor En vanlig sak är att mappa från en typ av värden till en annan typ (som ibland är samma typ) Exempel: map - omvandlar från en lista till en annan träd - listor är ju bara degenererade träd Maybe - omvandlar från en värde av typen X till Maybe X Så varför inte flytta upp detta en nivå

functor class Functor f where fmap :: (a -> b) -> f a -> f b f är typkonstruktor, inte en typ fmap tar alltså en funktion som omvandlar från typ a till b, och applicerar detta på något som använder typkonstruktorn f Jämför med map map :: (a -> b) -> [a] -> [b]

> map (+1) [10..15] [11,12,13,14,15,16] instance Functor [] where fmap = map > fmap (+1) [10..15] [11,12,13,14,15,16] instance Functor Maybe where! fmap f (Just x) = Just (f x)! fmap f Nothing = Nothing > fmap (+1) (Just 10) Just 11

Info > :info Int data Int = GHC.Types.I# GHC.Prim.Int#!-- Defined in GHC.Types instance Bounded Int -- Defined in GHC.Enum instance Enum Int -- Defined in GHC.Enum instance Eq Int -- Defined in GHC.Base instance Integral Int -- Defined in GHC.Real instance Num Int -- Defined in GHC.Num instance Ord Int -- Defined in GHC.Base instance Read Int -- Defined in GHC.Read instance Real Int -- Defined in GHC.Real instance Show Int -- Defined in GHC.Show

Uppgift 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 a = treeinsert 10 EmptyTree b = treeinsert 5 a c = treeinsert 20 b d = treeinsert 15 c e = treeinsert 1 d f = treeinsert 3 e g = treeinsert 0 f > show g "Node 10 (Node 5 (Node 1 (Node 0 EmptyTree EmptyTree) (Node 3 EmptyTree EmptyTree)) EmptyTree) (Node 20 (Node 15 EmptyTree EmptyTree) EmptyTree)"

> putstrln (prettyprint g) - 0-1 - 3-5 - 10-15 - 20 -

Möjlig lösning prettyprint x = pp "" x! where! pp indent EmptyTree = indent ++ "-\n"! pp indent (Node x l r ) = (pp (indent ++ " ") l) ++ indent ++ show x ++ "\n" ++ (pp (indent ++ " ") r)