Kurzusok
/
Julia
Julia
/
Feladatok
/
Gimis szerelem
Gimis szerelem

Gimis szerelem

Tanulófeladat

Bevezetés

A Julia arra biztatja a programozókat, hogy a lehető legtöbb kódot JIT-fordítható függvényekbe szervezzék, és sok kis függvény létrehozása eleve hatékony.

Ez általában sok kicsi, egyszerű függvényt hagy maga után, amelyeket kombinálni kell a nem triviális feladatok elvégzéséhez.

Egy kézenfekvő megközelítés a függvényhívások egymásba ágyazása. A következő példa nagyon erőltetett, de jól szemlélteti a lényeget.

julia> first.(titlecase.(reverse.(["my", "test", "strings"])))
3-element Vector{Char}:
 'Y': ASCII/Unicode U+0059 (category Lu: Letter, uppercase)
 'T': ASCII/Unicode U+0054 (category Lu: Letter, uppercase)
 'S': ASCII/Unicode U+0053 (category Lu: Letter, uppercase)

Ennek a megközelítésnek a hátránya, hogy az olvashatóság gyorsan romlik, ahogy a beágyazás egyre mélyebb lesz.

Egyszerűbb és rugalmasabb megközelítésre van szükségünk.

Kompozíció

Ez a matematikusok kedvelt technikája, és a Julia átveszi a matematikai szintaxist.

Tetszőleges számú függvény composed ∘ operátorokkal kapcsolható össze (a ∘ beírása: \circ, majd tab). Az eredmény egyetlen függvényként használható.

julia> compfunc = first ∘ titlecase ∘ reverse
first ∘ titlecase ∘ reverse
julia> compfunc.(["my", "test", "strings"])
3-element Vector{Char}:
 'Y': ASCII/Unicode U+0059 (category Lu: Letter, uppercase)
 'T': ASCII/Unicode U+0054 (category Lu: Letter, uppercase)
 'S': ASCII/Unicode U+0053 (category Lu: Letter, uppercase)
# alternative syntax, giving the same result
julia> (first ∘ titlecase ∘ reverse).(["my", "test", "strings"])

Néhány dolgot érdemes megjegyezni:

  • A kiinduló függvények ugyanabban a sorrendben jelennek meg, mint beágyazásnál, és jobbról balra hajtódnak végre.
  • A broadcast használata komponáláskor nem egyszerű, de a komponált függvény hívásakor alkalmazható.

Pipeline-ozás

Egy alternatíva a programozók megközelítéseként is felfogható, szemben a matematikusokéval.

A Pipelines régóta használatosak Unix shell szkriptekben, és az utóbbi időben népszerűvé váltak a mainstream programozási nyelvekben (az F#-nak néha tulajdonítják, hogy úttörő szerepet játszott elterjedésükben).

Az alapkoncepció: indulj ki valamilyen adatból, majd vezesd át egy függvénysorozaton, hogy megkapd az eredményt.

A pipe operátor a |> (mint az F#-ban és az R újabb verzióiban), bár a Juliának van egy broadcast változata is: .|>.

julia> ["my", "test", "strings"] .|> reverse .|> titlecase .|> first
3-element Vector{Char}:
 'Y': ASCII/Unicode U+0059 (category Lu: Letter, uppercase)
 'T': ASCII/Unicode U+0054 (category Lu: Letter, uppercase)
 'S': ASCII/Unicode U+0053 (category Lu: Letter, uppercase)

A végrehajtás most szigorúan balról jobbra halad, és az egyes függvények kimenete a nyíl irányában áramlik, hogy a következő függvény bemenetévé váljon.

Korlátok, kerülőmegoldások és egyéb lehetőségek

Nem véletlen, hogy a kompozíció és a pipeline szemléltetésére használt függvények mind egyetlen argumentumot várnak.

Néhány tisztán funkcionális nyelv az első argumentumot fűzi be egy függvénybe, de a többit is engedi szerepeltetni.

Ezzel szemben a Julia egy pipeline-ban csak a függvények neveit (vagy valami egyenértékűt) várja, további argumentumok nélkül.

Ennek fontos technikai okai vannak (összefügg azzal, hogy a currying nem része szabványosan a nyelv tervezésének). A sok embernek, aki nem érti a curryingot, egyszerűen el kell fogadnia, hogy ez a korlátozás nem gondatlan mulasztás, és valószínűleg nem fog változni a jövőbeli Julia-verziókban.

Kerülőmegoldások

Olyan egyargumentumos függvényekre van szükségünk, amelyek elvégzik, amire éppen szükség van. Szerencsére új függvényeket könnyű definiálni a Juliában.

A legegyszerűbb, ha anonymous function-t használunk. Például ha van egy bemeneti stringünk, és alulvonások mentén szeretnénk felosztani:

julia> "my_test_strings" |> (s -> split(s, '_'))
3-element Vector{SubString{String}}:
 "my"
 "test"
 "strings"

Ezt a vektort aztán tovább lehet fűzni más függvényekhez, mint korábban.

A névtelen függvény zárójelbe tétele ebben az esetben opcionális, de általában hasznos módja a kétértelműség csökkentésének.

Ugyanígy létrehozhatunk egy névvel ellátott függvényt korábban a programban, és szükség szerint újra felhasználhatjuk.

Utasítások

Ebben a feladatban középiskolás szerelmespároknak segítesz szerelmet vallani a közösségi médiában azzal, hogy unicode szívet generálsz a kezdőbetűikből:

❤ J.  +  M. ❤

1. Tisztítsd meg a nevet

Valósítsd meg a cleanupname metódust. Ez kap egy nevet, eltávolít belőle minden - karaktert, és szóközre cseréli őket. A név elejéről és végéről is eltávolít minden whitespace-t.

julia> cleanupname("Jane-Ann")
"Jane Ann"

2. Kérd le a név első betűjét

Valósítsd meg a firstletter metódust. Ez kap egy nevet, és visszaadja annak első betűjét stringként. Ügyelj rá, hogy újrahasználd a korábbi lépésben definiált cleanupname-t, és más függvényekkel komponálva építsd fel.

julia> firstletter("Jane")
"J"

3. Alakítsd az első betűt iniciálévá

Valósítsd meg az initial metódust. Ez kap egy nevet, és visszaadja annak első betűjét nagybetűvel, egy ponttal a végén. Ügyelj rá, hogy újrahasználd a korábbi lépésben definiált firstletter-t.

initial("Robert")
"R."

4. Tedd az iniciálékat a szívbe

Valósítsd meg a couple metódust. Ez két nevet kap, és az iniciálékat emoji szívekkel körbevéve adja vissza. Ügyelj rá, hogy újrahasználd a korábbi lépésben definiált initial-t.

couple("Blake Miller", "Riley Lewis")
"❤ B.  +  R. ❤"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Julia Exercism

Készen állsz elkezdeni a(z) Gimis szerelem feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Julia nyelvet 35 fogalom128 feladat segítségével, valódi emberi mentorálással, mindez ingyen.