Funktionell Programmering, SMD001

- Utdelat, Kursinfo, Kursmtrl, Övrigt; Resultat för D1a, D1b, E1, DI1, DTI2 och Val -
Ändrades senast:

Kursen har avslutats och informationen här är därför inaktuell.
Kursen ges på nytt LP1, 2002. /Håkan

Meddelanden

Senaste nytt ligger överst på listan. Kontrollera alltid först om någon ny information postats på vårt interna nyhetsnät. Inom parenteser återfinns datum då meddelandet skrevs in. Tidigare nyheter och meddelanden återfinns på en separat sida.
  • Tentan och lösningsförslag...(26/10)
    ... finns nu i arkivet med gamla tentor.
  • Kursutvärdering(25/10)
    Till tentan i morgon finns en kursutvärderingsenkät bifogad. Viktigt: Skriv först klar din tentamen innan du ägnar tid åt enkäten! Lämnas anonymt till tentamensvakten eller läggs senare i mitt fack i A-huset (det går förstås bra att fylla i enkäten hemma om man vill och lämna in den senare).
  • Gamla tentor(23/10)
    Arkivet med gamla tentor har nu uppdaterats med årets tentor. Den ena finns det lösningförslag till.
  • Inläsningsanvisning(23/10)
    Inläsningsanvisning/tips inför tentan den 2001-10-26:
    1. Kursboken kapitel 1-14 och 17.1 förutom 8, 10.9, 12.5, 13, 14.7.
       Appendix A och D kan vara till hjälp.
       Bland meddelandena här hittar du också en del detaljerade inläsnings-
       anvisningar. 
    2. Alla laborationsuppgifter (i synnerhet de sista). 
    3. Alla hemuppgifter.
    4. Denna kurssida, och då speciellt arkivet med gamla tentor (en del med 
       läsningsförslag).
    
    Se till att du har läst igenom listan med fördefinierade funktioner/operatorer som får användas på tentamen utan att närmare definieras. Denna lista kommer att bifogas tentan. OBS! Alla andra funktioner du använder måste definieras.
  • Detaljerad inläsningsanvisning 12(11/10)
    Föreläsning nr 12 på torsdag 11/10 innehåller en snabb repetition och ett antal exempel på tentauppgifter.

    Det kommer inte att ske någon genomgång av material från nåt speciellt avsnitt i boken.

  • Tentamenstid(10/10)
    E-mail från tentaadm:
    Skrivtiderna för SMD001, SMD090, SMD108 är klara, dom går mellan kl 9-13.
    
    SMD001 ges i F 400 - salarna
    SMD090 ges i F 434
    SMD108 ges i F 1346, F 1348
    
  • Sagolika hemuppgiften(9/10)
    Om man vill testköra show så måste man döpa den till något annat. (Det finns redan en show.)
  • Botaniska hemuppgiften(9/10)
    I deluppgift 1 ska in bytas mot inside. Eftersom in är ett reserverat ord så får man inte använda in som typvariabel.
  • Detaljerad inläsningsanvisning 11(8/10)
    Föreläsning nr 11 på tisdag 9/10 handlar om att definiera egna typer, mest olika slags träd, och klasser.
    1. 14.3.
    2. sid. 267 om "Error types".
    3. sid. 247 om "Deriving instances of classes".
    4. 12.1 Överladdning, dvs att en operator kan vara definierad för olika typer.
    5. 12.2 - 12.3: Att skapa klasser och stoppa in typer i klasser.
    6. 12.4 (220 - 223): Inbyggda klasser (t ex Eq, Show, Ord).
  • Tentamen(8/10)
    Tentamen ges fredag 26/10 och varar 4 timmar. Exakt tid på dygnet har jag ännu inte fått reda på så det återkommer jag med.
  • deriving(8/10)
    Hugs kan inte utan vidare skriva ut, jämföra, ordna etc värden från typer vi själva definierar ty typer hamnar inte automatiskt i klasserna Show, Eq, Ord etc. För "enkla" typer+ finns det ett enkelt sätt att inkludera typer i klasser; man skriver till deriving och klassnamn efter typdefinitionen. Exempel:

    data T = Apelsin | Päron
      deriving Show
    
    Värdena i T kan nu skrivas ut av Hugs (om de t ex är resultatet från en funktion). De kan dock inte jämföras med ==. Om vi vill kunna jämföra dem så kan man istället skriva
    data T = Apelsin | Päron
      deriving (Show,Eq)
    
    ... och vips! så funkar ==. (OBS! Det är inget magiskt med detta! Men det är lite krångligt att förklara exakt hur det går till. PÅ föreläsning 11 på tisdag 9/10 så kommer jag att gå igenom ett sätt att manuellt skapa klasser och stoppa in typer i klasser.)
  • Detaljerad inläsningsanvisning 10(4/10)
    Föreläsning nr 10 på fredag 5/10 handlar om algebraiska typer, som är typer vi själva tillverkar.
    1. 14.1 fram till mitten av sid. 247.
    2. 14.2 till "Rearranging expressions" på sid. 252.
    (OBS! Algebraiska typer /= typsynonymer!)
  • Typsynonym(4/10)
    type Line=String är en typsynonym och betyder helt enkelt bara att Line är detsamma som String. Funktionen

    f :: Line -> Int

    tar alltså en sträng som argument. Typsynonymer används för att öka programs läsbarhet.

  • Korsreferenshjälp(3/10)
    1. I avs. 10.8 i kursboken finns ett exempel som i hög grad påminner om labben. Läs det.
    2. Operatorn >.> definieras på sidan 170 i kursboken. Den fungerar som operatorn . men med operanderna omkastade.
    3. Läs på om vilka tecken som en identifierare kan innehålla och på vilket sätt dessa tecken kan bilda identifierare (endast vissa sekvenser av tecken tillåts).
  • Övningspass(3/10)
    Ta fram ditt schema och markera att följande görs på kommande övningspass:
    1. onsdag 3/10-torsdag 4/10: Redovisning av den sagolika hemuppgiften.
    2. fredag 5/10 - måndag 8/10: Ingen redovisning av hemuppgifter. Istället en genomgång av ett antal uppgifter (från boken, gamla tentor, gamla hemuppgifter etc).
    3. onsdag 10/10 - fredag 12/10: Redovisning av hemuppgifter från både föreläsning nr 10 på fredag 5/10 och föreläsning nr 11 på tisdag 9/10.
    4. måndag 15/10 - tisdag 16/10: Redovisning av hemuppgift från föreläsning nr 12, den sista, på torsdag 11/10.
  • Schemaproblem(2/10)
    (Kommer strax ett inlägg om övningspassen som verkar ha schemalagts i fel ordning :-( jämfört med hur det var tänkt.)
  • Sagolikt fel(2/10)
    Ett fel har smugit sig in i den sagolika hemuppgiften. I det första exemplet i uppgift 1 så ska

    ((==0).`mod` 2)

    vara

    (\x y -> x `mod` y == 0)

  • Detaljerad inläsningsanvisning 9, II(1/10)
    Avs. 10.3 om att funktioner är värden och kan vara resultat från (andra) funktioner.
    Avs. 10.4 (175-177).
    Avs. 10.7: curry, uncurry, flip.
    (Avs. 10.8 är nyttigt att gå igenom om man vill ha en del tips för korsreferenslabben.)
  • Sorteringsordning(30/9)
    Observera att sort i filen sort.hs sorterar fallande; vill man ha stigande är det bara att ändra det boolska uttrycket. Alternativet är att reversera den sorterade listan.
  • "identifierare"(30/9)
    Identifierare definieras i kursbokens appedix b. Läs noga, för denna definition avgör hur xref_table ska fungera.
  • sort.hs(30/9)
    Filen sort.hs har fått nytt (korrekt) innehåll. Testkör med denna nya version. Läs mer i nästa meddelande.

    Funktionen sort i sort.hs fungerar som tidigare men vissa identifierare har bytt namn.

  • Korsreferens-laborationen(30/9)
    Nytt exempel som main ska testköras på:

    Om en fil sort.hs innehåller

    sort :: Ord a => [a] -> [a]
    sort []    = []
    sort (h':t) = insert_value h' (sort t)
                 where
                   insert_value :: Ord a => a -> [a] -> [a]
                   insert_value v []    = [v]
                   insert_value v (b:l) = if
                                      v>=b
                                    then v:(b:l)
                                    else b:(insert_value v l)
    
    så är main "sort.hs" listan
    Main> main "sort.hs"
    [("Ord",[1, 5]), ("a",[1, 1, 1, 5, 5, 5, 5]), ("b",[7, 8, 9, 10]), 
    ("h'",[3, 3]), ("insert_value",[3, 5, 6, 7, 10]), ("l",[7, 9, 10]), 
    ("sort",[1, 2, 3, 3]), ("t",[3, 3]), ("v",[6, 6, 7, 8, 9, 10])] :: IO ()
    Main> 
    
    Skillnaden från exemplet i häftet ligger i att h bytts mot h' och insert mot insert_value. Notera att ' och _ (apostrof och understyrkningstecken) kan finnas i identifierare tillsammans med bokstäver och siffror. MEN: Mönstret _ (ett "wildcard") och uttrycket 'A' (ett tecken, ett Char) är inga identifierare.

Utdelat mtrl mm

OBS! Materialet läggs ut efter föreläsningarna. OBS!

(Försök själv få fram utdelat material från denna sida. Kontakta labhandledare eller lärare först om detta inte lyckas.)

Annat:

Kursmaterial

Läroböcker:

Säljs av Bokis.
  • Simon Thompson: Haskell -- The Craft of Functional Programming, 2nd ed., Addison-Wesley, ISBN 0-201-34275-8.
  • Håkan Jonsson (red): Funktionella laborationer - Kurskompendium i kursen SMD001/090/108.

Programvara och dokumentation

Det datorprogram vi använder för att få datorn att utföra Haskellprogram heter Hugs och finns liksom diverse annat tillgängligt på WWW.
  • Hugs. Här kan du läsa mer om Hugs och även ladda hem en egen version till din hemdator.
  • Lokal dokumentation om den version av Hugs som vi använder.
  • Hemsidan för Haskell. Innehåller bl a den formella definitionen av Haskell och länkar till några andra ställen i världen där man ger kurser i funktionell programmering.
  • Gofer, ett alternativt Haskellsystem för Macintosh (fungerar även på gamla maskiner).

Kursinformation

Lärare
Labhandledare:
Läs gärna studiehandbokens beskrivning av kursen (innehållet i kurserna SMD001, SMD090 och SMD108 är detsamma) och grovplanen (PostScript).

På nätet finns slutligen också kursens schema (markera det du vill ha med, klicka på "Fortsätt" osv).

Till dig som går SMD108: Av tekniska skäl saknas kursens föreläsningar på schemat för kursen SMD108, men eftersom föreläsningarna är gemensamma för alla som läser funktionell programmering så får du ett komplett schema genom att ta med föreläsningarna från antingen SMD001 eller SMD090.

/Håkan