Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Funktio-ohjelmointi ja Java

Samankaltaiset esitykset


Esitys aiheesta: "Funktio-ohjelmointi ja Java"— Esityksen transkriptio:

1 Funktio-ohjelmointi ja Java
TIEA341 Funktio-ohjelmointi 1 Syksy 2005

2 Tyyliseikka: final Jos muuttujan ei tarvitse olla muuttuva, määrittele se final-avainsanalla potentiaalisesti helpottaa kääntäjän työtä mutta olennaisemmin: jotkin seuraavista tempuista toimii heikommin, jos muuttujat ovat yleeensä ei-final! final double pi = ; final String hello = “Hello World!”;

3 Rekursiosta Javaa ei ole suunniteltu jatkuvaa rekursionkäyttöä varten
muuta rekursio luupiksi aina kuin se on järkevää helppo tapa: muuta ensin yleinen rekursio häntärekursioksi (rekursiivinen kutsu on viimeinen asia, mitä funktio tekee) public int f(int x) { int a = 0; while (!(x < = 0) { a = 2 * x + a; x = x – 1; } return a; f = f 0 where f' a x | x <= 0 = a | otherwise = f' (2*x+a) (x-1)

4 Seuraavaksi Ydin-Haskell -> Java
Mekaaninen muunnos Erittäin tehoton Mutta toivottavasti valaiseva Luokkahierarkian ylin on LazyObject abstract class LazyObject {} Java 1.5:n käyttökelpoistumista odotellessa tyypitys on pääosin ajonaikaista Generics mahdollistaisi tarkemman tyypityksen

5 Algebralliset tietotyypit 1
data T = A B C | D E F ==> abstract class T extends LazyObject { public interface Cases { LazyObject ifA(B p1, C p2); LazyObject ifD(E p1, F p2); } public abstract LazyObject cases(Cases cs);

6 Algebralliset tietotyypit: Int
// -- data Int = Int Int# abstract class LazyInt extends LazyObject { public interface Cases { LazyObject ifInt(int n); } public abstract LazyObject cases(Cases c); public static LazyInt constant(final int n) { return LazyInt { public LazyObject cases(Cases c) { return c.ifInt(n); };

7 Laiskat funktiot 1 abstract class LazyFunction extends LazyObject {
public abstract LazyObject call(LazyObject o); } \ x = x ==> new LazyFunction { public LazyObject call(LazyObject x) { return x; }; f 0 ((LazyFunction)f).call(LazyInteger.constant(0))

8 Laiskat funktiot 2 //lazyPlus = \a -> \b ->
// case a of Int i -> case b of Int j -> Int (i+j) LazyFunction lazyPlus = new LazyFunction { public LazyObject call(final LazyObject a) { return new LazyFunction { public LazyObject call(final LazyObject b) { return ((LazyInt)a).cases(new LazyInt.Cases { public LazyObject ifInt(final int i) { return ((LazyInt)b).cases (new LazyInt.Cases { public LazyObject ifInt(final int j) { return new LazyInt { public LazyObject cases (LazyInt.Cases c) { c.ifInt(i+j); }};});}});};}};

9 Algebralliset tietotyypit: Laiska lista
// data List a = Cons a (List a) | Nil abstract class LazyList extends LazyObject { public interface Cases { public LazyObject ifNil(); public LazyObject ifCons(Object x, LazyList xs); } public abstract LazyObject cases(Cases c); public static final LazyList NIL = new LazyList { public LazyObject cases(Cases c) { return c.ifNil(); }}

10 Ääretön lista // ones = Cons 1 ones LazyList ones = new LazyList {
private final LazyInteger one = LazyInteger.constant(1); public LazyObject cases(Cases c) { c.ifCons(one, ones); } };

11 Funktio: take LazyFunction take = new LazyFunction {
public LazyObject call(final LazyObject ln) { return new LazyFunction { public LazyObject call(final LazyObject li) { return (LazyInt n).cases(new LazyInt.Cases { public LazyObject ifInt(final int n) { if (n <= 0) return LazyList.NIL; return (LazyList li).cases (new LazyList.Cases { public LazyObject ifNil() { return LazyList.NIL; } public LazyObject ifCons(LazyObject h, LazyList t) { return t; }});}});}};}};

12 Pohdintaa Ei kaunista en suosittele “oikeissa” Java-ohjelmissa tuollaista Käyttökelpoisia tekniikoita kuitenkin: funktioiden esittäminen olioina vrt. GoF-suunnittelumalliin Command algebralliset tyypit ja case vrt. GoF-suunnittelumalliin Visitor Myös hieman esoteerisempia tekniikoita laiskan laskennan emuloiminen tosin edellä tehty toteuttaa vain normaalijärjestyksen kuinka tehtäisiin memoisaatio?


Lataa ppt "Funktio-ohjelmointi ja Java"

Samankaltaiset esitykset


Iklan oleh Google