Funktioteoriaa

722 views

Published on

F# Tyyppijärjestelmä
Function composition

Sanko F# -tapahtuman diasarja

2 Comments
0 Likes
Statistics
Notes
  • Be the first to like this

No Downloads
Views
Total views
722
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
2
Comments
2
Likes
0
Embeds 0
No embeds

No notes for slide
  • Puhuttaessa sivuvaikutuksettomista funktioista voimme itse asiassa funktion tyypistä päätellä pitkälti funktion toiminnallisuuden (ja oikeellisuuden).
  • “Yhdistetty funktio”: Yhdistää kaksi funktiota.- “X:lle, suorita ensin g, sitten f.”- Englanniksi: “f of g of x”
  • Ei olio-ohjelmoinnin jähmeyttä Mahdollistaatop-down designin
  • Usein haluamme liittää toisiinsa asioita, jotka eivät ihan suoraa liity toisiinsa…Monad käsite on Haskell:ista lähtöisin ja siellä oikeastaan ainoa tapa sivuvaikutuksien suoritukselle
  • Itse asiassa Nullable<T> on sama asia kuin lista jossa on joko 0 tai 1 alkiota.
  • Lisätään asiat domainiinMuuntaminen:KäsitelläändomainiaPoistetaan asiat domainista
  • 2: (a -> M<b>) parametri on muuntofunktio3: (b -> a -> b) funktio on koontifunktio ja b kuvaa eräänlaista kerättävää "accumulator":ia.
  • Näitä ketjuttamalla voimme luoda vaikka mitä (ilman muuttujaparametreja) I on turha, I 5 = S (K) (K) (5) Eräs "kirkkoherra" mm. todisti, että pelkillä funktioilla voidaan esittää numerot ja myös boolean-operaatiot. On jopa tehty ohjelmointikieli, joka perustuu näiden funktioiden kutsujen yhdistelyyn.
  • Mitä jos f(x) funktiolle antaa parametriksi itsensä, eli f:än? Syntyy rekursio ja ikiluuppi… Luupin ja lopetusehdon voi jakaa omiksi funktioikseenY saadaan tietysti aikaan myös SKI-kalkyylilla
  • Funktioteoriaa

    1. 1. F#<br />funktioteoriaa<br />
    2. 2. F#<br />tyyppijärjestelmä<br />
    3. 3. //Sulutus ei ole pakollista:<br />letf(x,y) = x+y<br />let f x y = x+y<br />
    4. 4. //Funktion tyyppi:<br />let I x = x<br />// x: 'a<br />// I: 'a -> 'a<br />
    5. 5. //Esimerkki 2:<br />let K x y = x<br />// x: 'a<br />// y: 'b<br />// K: 'a -> 'b -> 'a<br />
    6. 6. //Osittainen suoritus<br />letvakioMoi= K "Moi”<br />let moi = vakioMoi123<br />valvakioMoi : (int -> string)<br />//moi :string ="Moi”<br />
    7. 7. //Esimerkki 3:<br />let S x y z = x(z)(y(z))<br />// x: f(a b)<br />// x: a -> b -> c<br />// z: a<br />// y: a -> b<br />S x y z: (a -> b -> c) -> (a -> b) -> a -> c<br />
    8. 8. //Harjoitus: Mitä oheiset funktiot tekevät?<br />val it : <br />(('a -> 'b) -> 'a list -> 'b list)<br />val it : <br />(('a -> 'b -> 'a) -> 'a -> 'b list -> 'a)<br />val it : ('a * 'b -> 'a)<br />
    9. 9. f(g(x))<br />F#<br />function composition<br />
    10. 10. //function composition<br />let yhdistä f g x = g(f(x)) <br />let yhdistä f g x = (f>>g)x<br />// f: 'a -> 'b<br />// g: 'b -> 'c<br />// x: 'a<br />yhdistä f g x: (a -> b) -> (b -> c) -> a -> c<br />
    11. 11. //Jälkimmäisestä voi repiä parametrin pois<br />let yhdistä f g= (f>>g)<br />// yhdistä: ('a -> 'b) -><br /> ('b -> 'c) -><br /> ('a -> 'c)<br />
    12. 12. lopputulos: yleiskäyttöinen abstraktio sitoutumattakonkreettisiin tyyppeihin<br />let käsittele = (tallenna >> validoi >> lähetä) <br />
    13. 13. F#<br />monadit<br />
    14. 14. ajatus LINQ:n takana<br />“list monad”IEnumerable<T><br />“maybe monad”Nullable<T><br />…<br />
    15. 15. kolmen tyyppisiä operaatioita<br />1.<br />3.<br />'a -> M<’a><br />M<'a> -> 'b<br />2.<br />M<'a> -> M<'b><br />
    16. 16. tyyppiesimerkit<br />2.<br />M<'a> -> ('a -> M<'b>) -> M<'b><br />3.<br />M<'a> -> <br />'b -> ('b -> 'a -> 'b) -> 'b<br />
    17. 17. F#<br />kombinaattorit<br />
    18. 18. S- K- I- kombinaattorit<br />Kuten alussa:<br />I x = x<br />K x y = x<br />S x y z =<br /> x z (y z)<br />
    19. 19. y-kombinaattori<br />f(x) kun x=f?<br />f(f) = f ja f=f(f)<br />f(g) = g(f(g))<br />Y = S (K (S I I)) (S (S (K S) K) (K (S I I)))<br />
    20. 20. lähteet / linkit<br />http://en.wikipedia.org/wiki/SKI_combinator_calculus<br />http://en.wikipedia.org/wiki/Fixed_point_combinator<br />http://community.bartdesmet.net/blogs/bart/archive/2009/08/17/mis-using-c-4-0-dynamic-type-free-lambda-calculus-church-numerals-and-more.aspx<br />http://blogs.msdn.com/b/madst/archive/2007/05/11/recursive-lambda-expressions.aspx<br />http://www.madore.org/~david/programs/unlambda/<br />http://channel9.msdn.com/Shows/Going+Deep/Brian-Beckman-Dont-fear-the-Monads<br />http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Greg-Meredith-Monadic-Design-Patterns-for-the-Web-Introduction-to-Monads<br />http://blogs.msdn.com/b/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx<br />http://channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-MinLINQ-The-Essence-of-LINQ<br />http://ttic.uchicago.edu/~dreyer/course/papers/wadler.pdf<br />http://www.meetup.com/FSharpHelsinki/messages/boards/forum/1395955<br />

    ×