Tyyppiluokat II ­ konstruktoriluokat, funktionaaliset riippuvuudet ­

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

18. Abstraktit tietotyypit
15. Loogiset operaatiot.
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
6. Metodit.
© Hannu Laine 1 Tietorakenteet ja algoritmit Funktio-osoittimet Funktio-osoittimen ja taulukko-osoittimen vertailu Funktio-osoittimen käyttötapoja.
16. Javan omat luokat.
Nämä kalvot on lisensoitu Creative Commons Attribution-ShareAlike 1
Taulukot: Array Taulukko Javassa pitää aina perustaa (new)
10/9/2012 © Hannu Laine 1 Tietorakenteet ja algoritmit Listan määritelmä Listan toteutustapoja Yksinkertainen taulukkototeutus Linkattu taulukko Dynaamisesti.
C-ohjelmointi, kevät 2006 Taulukot Binääritiedostot Luento
Tietokannat II Lasse Bergroth Turun yliopisto, IT-laitos Kevät 2013
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Tietorakenneluokkia 2: HashMap, TreeMap.
OLIO-OHJELMOINTI PERUSTEET PERUSTIETOTYYPIT
Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1.
Tekstitiedostosta lukeminen tMyn1 Tekstitiedostosta lukeminen Tiedosto voidaan avata pelkästään lukemista varten tai kirjoittamista ja lukemista varten.
UMF I Luento 1. Aika Luennot, Klo 14–16 to 4.9 – ke 10.9 ke 24.9 – ke 1.10 ke – pe Demot, Klo 10–12/12–14/14–16 Pe 12.9, Ti 16.9, Pe 19.9.
Funktion esittely eli prototyyppi tMyn1 Funktion esittely eli prototyyppi Funktion esittely (function declaration) kertoo funktion nimen, parametrien tyypit.
Erilaiset liitokset FROM-osassa voidaan määritellä relaatio myös erilaisia liitosoperaatioita käyttäen Vasen, oikea ja täysi puoliliitos eli ulkoliitos.
ict1td002 - Copyright Raine Kauppinen 1 Alkuarvot ja tyyppimuunnokset (1/5)  Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
Ontologia Hanna Hirvonen. Käsite Ontologia ● Peräisin filosofiasta oppi olevaisesta ● Kuvaus tarkasteltavan sovellusalueen käsitteistä ja niiden välisistä.
Tietokannan normalisointi
RAKENNUSPALIKOITA SEINÄJOEN KANSALAISOPISTO Jussi Rasku Aki Sirviö.
© Jukka Juslin1 Osio2 Olio-ohjelmointi: Merkkijonot eli Stringit Jukka Juslin.
Johdatus ohjelmointiin – C kielen peruselementit Tutkijayliopettaja Manne Hannula Opetusharjoittelu (ohjaava opettaja Jukka Jauhiainen)
Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka.
DO NOT PRINT THIS DOCUMENT SQL -valintaehto CREATE TABLE opettaja ( opetunnus varchar(12) NOT NULL, nimi varchar(40) NOT NULL, puhelin varchar(12), tyohuone.
1 Rio s05 / Liisa Marttinen Kertaus: Semaforit Semaforin operaatiot: sem s = n; # semaforin alkuarvo P(s); # jos s
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
1 Rio / Auvo Häkkinen Kertaus: Semaforit Semaforin operaatiot: sem s = n; # semaforin alkuarvo P(s); # jos s
Liiketoimintaprosessit ja MS Visio 2010
Hajoita ja hallitse (divide and conquer) Pikalajittele n-alkioinen taulukko 1. Divide: Jaetaan taulukko kahdeksi alitaulukoksi tukialkion (pivot) x suhteen:
Ohjelmassa tänään Ohjelmointimallit Pseudokieli Modulaarisuus.
Monadit TIES341 Funktio-ohjelmointi 2 Kevät 2006.
Abstraktit tietotyypit – jatkoa TIEA341 Funktio-ohjelmointi 1 Syksy 2005.
Abstraktit tietotyypit TIEA341 Funktio-ohjelmointi 1 Syksy 2005.
Jatkeet TIES341 Funktio-ohjelmointi 2 Kevät 2006.
Olio-ohjelmoinista lyhyesti. 2.2 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen.
Uusi näkökulma TIEA341 Funktio-ohjelmointi 1 Syksy 2005.
Opiskella (to study) & kävellä (to walk) & tulla (to come) verbityyppi 3.
Taas laskin TIES341 Funktio-ohjelmointi 2 Kevät 2006.
String-vertailusta ja Scannerin käytöstä (1/2)
Olio-ohjelmointi Olio-ohjelmoinnissa keskeisiä käsitteitä ovat luokka ja olio. Olio on abstraktio jostakin ongelma- tai ratkaisualueen käsitteestä. Oliolla.
Liiketoimintaprosessit ja MS Visio 2013
Markkinoiden juridinen toimintaympäristö Luento 7
3. Olio-ohjelmoinista lyhyesti
Laiska laskenta, korekursio ja äärettömyys
Funktionimien kuormitus
Heippa taas! Kiva nähdä!.
Julkaisufoorumin kuulumiset
Monadeja siellä, monadeja täällä... monadeja kaikkialla?
Funktio-ohjelmointi ja Java
Poikkeustenkäsittelylohkot try-catch
Yhteenvetoa ja sovelluksia
Scala Collections.
TIES341 Funktio-ohjelmointi 2 Kevät 2006
13. Loogiset operaatiot.
TIES341 Funktio-ohjelmointi 2 Kevät 2006
YLIOPISTOTENTTI / UNIVERSITY EXAM
TIEA341 Funktio-ohjelmointi 1 Syksy 2005
TIES341 Funktio-ohjelmointi 2 Kevät 2006
Vielä laskentoa: kertausta ja täsmennystä
Arvorekursio: monadit solmuun
6. Metodit.
16. Javan omat luokat.
4. Attribuutit.
15. Ohjelmoinnin tekniikkaa
Liiketoimintaprosessit ja MS Visio 2010
13. Loogiset operaatiot.
Esityksen transkriptio:

Tyyppiluokat II ­ konstruktoriluokat, funktionaaliset riippuvuudet ­ TIES341 Funktio-ohjelmointi 2 Kevät 2006

Alkuperäislähteitä Philip Wadler & Stephen Blott: “How to make ad-hoc polymorphism less ad-hoc”, Proceedings of the 16th ACM SIGPLAN-SIGACT symposium on Principles of programming languages, ACM, 1989 Mark P. Jones: “A system of constructor classes: overloading and implicit higher-order polymorphism”, Proceedings of the conference on Functional programming languages and computer architecture, ACM, 1993 Simon Peyton Jones & Mark Jones & Erik Meijer: “Type classes: an exploration of the design space”, Proceedings of the Haskell Workshop, Amsterdam, The Netherlands, June 6, 1997. http://www.cse.ogi.edu/~mpj/pubs/multi.html Mark P. Jones: “Type classes with Functional Dependencies”, Programming Languages and Systems: 9th European Symposium on Programming, ESOP 2000. Lecture Notes in Computer Science 1782, Springer 2000.

Mapin ongelma map :: (a -> b) -> [a] -> [b] Data.Map.map :: (a -> b) -> Data.Map.Map k a -> Data.Map.Map k b yhteistä: “sovella tätä funktiota tämän tietorakenteen kaikkiin alkioihin” Voisiko nämä kaksi samankaltaista funktiota olla samannimisiä (niin, että voitaisiin kirjoittaa yleiskäyttöisiä funktioita, jotka käyttävät tilanteesta riippuen jompaa kumpaa)?

Tyyppiluokista ratkaisu? class Mappable m where map :: (a -> b) -> ??? Edellisen luennon tyyppiluokat olisivat kiva ratkaisu, jos se onnistuisi Mitä ylläolevaan tulee ???:n paikalle? m -> m? Ei oikein m a -> m b? joo, mutta mikä ihme m tässä on? ei ainakaan tyyppimuuttuja? tyyppikoostinmuuttuja?

Konstruktoriluokat (1) Tyyppiluokkien yleistys nykyisin tosin termi “tyyppiluokka” sisältää tämänkin Sallitaan, että tyyppimuuttuja voi edustaa paitsi tyyppiä myös tyyppikoostinta tarvitaan “tyyppien tyypit”, englanniksi “kinds” tyyppimuuttuja, joka edustaa tyyppiä, on kindiltään * tyyppimuuttuja, joka tarvitsee yhden tyyppiparametrin, on kindiltään * -> * ... jne myös “tyyppilausekkeella” (esim. m a tai Maybe Int) on oma kindinsä tyyppilauseke on tyyppi, jos sen kind on *

Konstruktoriluokat (2) Konstruktoriluokka on muuten kuin tavallinen tyyppiluokka mutta sen tyyppimuuttuja voi olla minkä kindinen tahansa mutta tuon kindin pitää olla yksikäsitteinen, ts. sitä ei voi käyttää samassa luokassa esim. sekä tyyppinä että yksiparametrisena tyyppikoostimena instance-määrittelyssä tyyppimuuttujan paikalle laitetaan samankindinen tyyppilauseke

Vakiokirjaston tyyppiluokka: Functor class Functor f where fmap :: (a -> b) -> f a -> f b instance Functor Maybe where fmap f (Just a) = Just (f a) fmap f Nothing = Nothing instance Functor [] where fmap = map

Vakiokirjaston tyyppiluokka: Monad (1) class Monad m where return :: a -> m a fail :: String -> m a (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b p >> q = p >>= \_ -> q fail s = error s

Vakiokirjaston tyyppiluokka: Monad (2) instance Monad [] where return a = [a] xs >>= f = concatMap f xs instance Monad Maybe where return a = Just a fail _ = Nothing Just a >>= f = f a Nothing >>= _ = Nothing instance Monad IO where ...

Vakiokirjaston tyyppiluokka: Monad (3) do pat <- e rest ==> e >>= \pat -> do rest do e rest e >> do rest do let pat = e let pat = e in do rest do on oikeasti vain syntaktista sokeria tämä muunnos on hyödyllinen malli, mutta ei aivan totuudenmukainen monadeista tarkemmin myöhemmin

Ongelma: säilötyyppiluokka Miten tyyppiluokilla ilmaista säilön (container) rajapinta? OK, mutta voiko tyyppi a -> Bool kuulua tähän konstruktoriluokkaan? Ei voi, sillä siitä ei ole sopivaa * -> * -kindattua versiota. class Container s where empty :: s a insert :: a -> s a -> s a member :: a -> s a -> Bool

Moniparametrityyppiluokat (1) Yleistetään vähän vielä: sallitaan tyyppiluokalle useampi tyyppiparametri nyt tyyppiluokka ei ole (välttämättä) tyyppien joukko, vaan se voi myös olla tyyppien välinen relaatio class Collection e ce where empty :: ce insert :: e -> ce -> ce lookup :: e -> ce -> Bool

Moniparametrityyppiluokat (2) Liian yleinen keinovara empty ei ole laillinen, sillä sen tyypissä ei esiinny molemmat tyyppimuuttujat Mikä on seuraavien tyyppi? f x y coll = insert x (insert y coll) g coll = f True 'a' coll Vastaus: f :: (Collection a c, Collects b c) => a -> b -> c -> c g :: (Collection Bool c, Collection Char c) => c -> c f:n tyyppi on liian yleinen! (a:n ja b:n pitäisi olla samat!)

Funktionaaliset riippuvuudet (1) Tyyppiluokan Collection e ec ensimmäinen parametri on oikeasti toisen parametrin funktio! e on säilön sisältämän datan tyyppi tieto siitä sisältyy aina säilötyyppiin ec itseensä esim. Collection Int [Int] Ilmaistaan tämä riippuvuus eksplisiittisesti: lue: “Collection on tyyppimaailmassa elävä (osittais)funktio, joka yhdistää tyypin ec tyyppiin e” class Collection e ec | ec -> e where ...

Funktionaaliset riippuvuudet (2) Yleisesti: moniparametrityyppiluokan esittelyssä voidaan määritellä parametrien välisiä riippuvuuksia: class C tyyppimuuttujia | riippuvuudet where ... riippuvuudet ovat muotoa tyyppimuuttujia -> tyyppimuuttujia “oikealla puolella olevat tyyppimuuttujakokoelma on vasemmalla puolella olevan tyyppimuuttujakokoelman funktio”

Esimerkki lineaarialgebraa...

Lopuksi Ensi tiistaina ei ole luentoa Luennoija istuu käräjiä :)