Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys · Oppitunti

Ensiluokkaiset ja korkeamman asteen funktiot

Ymmärrätte funktiot arvoina, niiden välittämisen ja tehokkaiden korkeamman asteen funktioiden luomisen.

Oppitunti 1/411 vaihetta

Ensiluokkaiset ja korkeamman asteen funktiot on ilmainen Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-kurssilla on yhteensä 4 oppituntia.

Funktiot: ensimmäisen luokan kansalaisia

Clojuressa funktiot ovat ”ensimmäisen luokan kansalaisia”. Tämä tarkoittaa, että niitä käsitellään kuten mitä tahansa muita arvoja, kuten lukuja tai merkkijonoja.

Voitte:

  • Sijoittaa niitä muuttujiin.
  • Välittää niitä argumentteina muille funktioille.
  • Palauttaa niitä muiden funktioiden tuloksina.

Tämä tehokas käsite on funktionaalisen ohjelmoinnin perusta!

Funktioiden sitominen nimiin

Katsotaan, miten funktioita voidaan käsitellä arvoina sitomalla ne nimeen def- tai let-komennolla. Ajatelkaa sitä funktion lempinimen antamisena.

Kokeilkaa suorittaa tämä esimerkki:

(ns coddykit.core
  (:gen-class))

(defn greet [name]
  (str "Hello, " name "!"))

(defn -main [& args]
  (println "--- Output ---")
  (def my-greeting greet) ; Assign 'greet' function to 'my-greeting'
  (println (my-greeting "Alice")))

Funktioiden välittäminen argumentteina

Ensimmäisen luokan funktioiden tärkeä ominaisuus on, että niitä voidaan välittää argumentteina muille funktioille. Tämä mahdollistaa erittäin joustavan ja uudelleenkäytettävän koodin.

Kuvitelkaa funktio, joka suorittaa jonkin toiminnon, mutta mikä toiminto suoritetaan, päätetään sille välitettävällä toisella funktiolla!

Kokeilkaa suorittaa tämä esimerkki:

(ns coddykit.core
  (:gen-class))

(defn operate [f x y]
  (f x y)) ; Call the function 'f' with arguments 'x' and 'y'

(defn -main [& args]
  (println "--- Output ---")
  (println (operate + 5 3)) ; Pass the '+' function
  (println (operate * 5 3))) ; Pass the '*' function

Funktiot, jotka palauttavat funktioita

Funktiot voivat myös luoda ja palauttaa uusia funktioita. Tämä on hyödyllistä rakennettaessa ”funktio-tehtaita”, jotka tuottavat syötteen perusteella erikoistuneita funktioita.

Tässä make-adder ottaa luvun ja palauttaa uuden funktion, joka lisää kyseisen luvun syötteeseensä.

Kokeilkaa suorittaa tämä esimerkki:

(ns coddykit.core
  (:gen-class))

(defn make-adder [x]
  (fn [y] (+ x y))) ; Returns an anonymous function

(defn -main [& args]
  (println "--- Output ---")
  (def add-five (make-adder 5))
  (def add-ten (make-adder 10))
  (println (add-five 2))
  (println (add-ten 2)))

Mitä korkeamman kertaluvun funktiot ovat?

Kun funktio ottaa argumenteikseen yhden tai useamman funktion tai palauttaa funktion tuloksenaan, sitä kutsutaan korkeamman kertaluvun funktioksi (HOF).

HOF-funktiot ovat erittäin tehokkaita, koska niiden avulla voitte:

  • Abstrahoida yleisiä toimintamalleja.
  • Kirjoittaa tiiviimpää ja ilmaisuvoimaisempaa koodia.
  • Luoda joustavia ja uudelleenkäytettäviä ohjelmakomponentteja.

Tarkastellaan seuraavaksi joitakin Clojuren yleisiä HOF-funktioita!

Muunna komennolla `map`

map on keskeinen korkeamman kertaluvun funktio. Se soveltaa annettua funktiota kokoelman jokaiseen alkioon, kuten listan tai vektorin alkioon, ja palauttaa tulokset sisältävän uuden kokoelman.

Se sopii erinomaisesti datan muuntamiseen alkuperäistä kokoelmaa muuttamatta.

Kokeilkaa suorittaa tämä esimerkki:

(ns coddykit.core
  (:gen-class))

(defn square [x] (* x x))

(defn -main [& args]
  (println "--- Output ---")
  (def numbers [1 2 3 4])
  (def squared-numbers (map square numbers))
  (println "Original numbers:" numbers)
  (println "Squared numbers:" squared-numbers))

Kokoelmien suodattaminen komennolla `filter`

filter-HOF ottaa parametrikseen ”predikaattifunktion” eli funktion, joka palauttaa arvon true tai false, sekä kokoelman. Se palauttaa uuden kokoelman, joka sisältää vain ne alkiot, joille predikaattifunktio palauttaa arvon true.

Tämä sopii erinomaisesti tiettyjen alkioiden valitsemiseen listasta.

Kokeilkaa suorittaa tämä esimerkki:

(ns coddykit.core
  (:gen-class))

(defn is-even? [n]
  (= (mod n 2) 0))

(defn -main [& args]
  (println "--- Output ---")
  (def numbers (range 1 11)) ; Numbers from 1 to 10
  (def even-numbers (filter is-even? numbers))
  (println "All numbers:" numbers)
  (println "Even numbers:" even-numbers))

Yhdistä komennolla `reduce`

reduce on toinen tehokas HOF-funktio, joka yhdistää kaikki kokoelman alkiot yhdeksi tulokseksi. Se ottaa yhdistämisfunktion, valinnaisen alkuarvon ja kokoelman.

Funktiota sovelletaan kumulatiivisesti jokaiseen alkioon, ja sitä käytetään usein summan laskemiseen, suurimman tai pienimmän arvon etsimiseen tai yhdistämiseen.

Kokeilkaa suorittaa tämä esimerkki:

(ns coddykit.core
  (:gen-class))

(defn -main [& args]
  (println "--- Output ---")
  (def numbers [1 2 3 4 5])
  (def sum (reduce + numbers)) ; Sums all numbers
  (def product (reduce * numbers)) ; Multiplies all numbers
  (println "Numbers:" numbers)
  (println "Sum:" sum)
  (println "Product:" product))

Nopeat funktiot: lambdat

Usein HOF-funktioille välitettävät funktiot ovat pieniä ja niitä käytetään vain kerran. Clojure tarjoaa tällaisia tilanteita varten nimettömiä funktioita, joita kutsutaan myös lambdoiksi.

Niissä käytetään lyhyttä #(...)-syntaksia, jossa % viittaa ensimmäiseen argumenttiin, %1 ensimmäiseen, %2 toiseen ja niin edelleen.

Kokeilkaa suorittaa tämä esimerkki:

(ns coddykit.core
  (:gen-class))

(defn -main [& args]
  (println "--- Output ---")
  (def numbers [1 2 3 4])
  (def doubled-numbers (map #(* % 2) numbers)) ; Anonymous function
  (def greater-than-two (filter #(> % 2) numbers)) ; Another anonymous function
  (println "Doubled:" doubled-numbers)
  (println "Greater than 2:" greater-than-two))

HOF-funktiot käytännössä

Olette oppineet ensimmäisen luokan ja korkeamman kertaluvun funktioista. Testataan nyt ymmärrystänne siitä, miten niitä voidaan yhdistää tiettyjen datamuunnosten tekemiseen.

Tarkastellaan lukujonoa (range 1 6), joka evaluoituu muotoon (1 2 3 4 5).

Mikä Clojure-lauseke käyttää korkeamman kertaluvun funktioita oikein saadakseen tästä jonosta listan, joka sisältää parillisten lukujen neliöt?

Kertaus: funktiot supervoimina

Onnittelut! Olette ottaneet Clojuren ensimmäisen luokan ja korkeamman kertaluvun funktioiden voiman käyttöönne!

Käsittelimme seuraavat asiat:

  • Ensimmäisen luokan funktiot: Funktioita voidaan käsitellä kuten mitä tahansa muuta tietotyyppiä – niitä voidaan sijoittaa muuttujiin, välittää argumentteina ja palauttaa muista funktioista.
  • Korkeamman kertaluvun funktiot: Funktiot, jotka käsittelevät muita funktioita eli ottavat niitä argumentteina tai palauttavat niitä.
  • Keskeiset HOF-funktiot: Tutustuimme map-funktioon muunnoksia, filter-funktioon valintaa ja reduce-funktioon koostamista varten.
  • Nimettömät funktiot: #(...)-syntaksi tiiviiden, suoraan koodiin kirjoitettujen funktioiden määrittämiseen.

Nämä käsitteet ovat ilmaisuvoimaisen ja joustavan Clojure-koodin kirjoittamisen perusta. Jatkakaa harjoittelua!

Aloita maksutta

Opi Clojure tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Ensiluokkaiset ja korkeamman asteen funktiot” ilmainen?

Kyllä – oppitunnin ”Ensiluokkaiset ja korkeamman asteen funktiot” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-kurssin, päivitä CoddyKit PROhon. Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Ensiluokkaiset ja korkeamman asteen funktiot”?

Ymmärrätte funktiot arvoina, niiden välittämisen ja tehokkaiden korkeamman asteen funktioiden luomisen. Harjoittelet Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Ensiluokkaiset ja korkeamman asteen funktiot”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppitunnilla?

Kyllä. Jokainen Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Ensiluokkaiset ja korkeamman asteen funktiot
  2. Muuttumattomuus ja pysyvät tiedot
  3. Laiskat sekvenssit ja suorituskyky
  4. Transducerit yhdisteltäviin muunnoksiin
← Takaisin: Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys