Elm - Panduan Cepat
Elm adalah bahasa pemrograman fungsional. Ini dirancang oleh Evan Czaplicki pada tahun 2012.
Elm secara khusus digunakan untuk mendesain front end aplikasi web.
Elm mengkompilasi ke JavaScript dan berjalan di browser. Ini cepat, dapat diuji, dapat dipelihara, dan tidak ada pengecualian Runtime.
Beberapa aplikasi praktis dari platform pemrograman Elm meliputi -
- Games
- Graphics
- Aplikasi Halaman Tunggal
Mengapa Elm
Elm menghilangkan sebagian besar masalah umum yang dihadapi oleh pengembang frontend. Ini termasuk -
Tidak Ada Pengecualian Waktu Proses
Elm adalah bahasa yang diketik secara statis. Semua kemungkinan kesalahan divalidasi dan dikoreksi pada waktu kompilasi. Ini memungkinkan untuk tidak memiliki pengecualian waktu proses.
Pesan Kesalahan Ramah Pengembang
Tidak seperti bahasa pemrograman lain, kompilator Elm dirancang untuk menyediakan pesan kesalahan yang sangat spesifik dan ramah pengembang pada waktu kompilasi. Pesan kesalahan juga menyertakan petunjuk seperti tautan ke dokumentasi desain yang direkomendasikan.
Mudah Diuji
Setiap fungsi Elm dapat diuji secara terpisah dari yang lainnya. Ini membuat program yang ditulis dalam Elm mudah diuji.
Pembuatan Versi Semantik Otomatis
Elm memberlakukan pembuatan versi semantik otomatis dari paket. Ini memastikan bahwa perubahan tambalan tidak merusak aplikasi yang sudah berjalan.
Kode yang Dapat Digunakan Kembali
Fungsi Elm secara inheren mudah digunakan kembali dibandingkan dengan fungsi di JavaScript, Python, atau TypeScript.
Bab ini membahas langkah-langkah untuk menginstal Elm di platform Windows, Mac dan Linux.
Pengaturan Lingkungan Lokal
Pertimbangkan langkah-langkah yang ditunjukkan di bawah ini untuk menginstal Elm di lingkungan lokal Anda.
Step 1 − Install node
Karena elm dikompilasi ke JavaScript, mesin target seharusnya memiliki nodeterpasang. Lihat kursus TutorialsPoint NodeJS untuk langkah-langkah penyiapannode dan npm
Pengaturan node.Step 2 − Install elm
Jalankan perintah berikut di terminal untuk menginstal elm. Perhatikan bahwa elm versi stabil adalah 0.18 pada saat penulisan kursus ini.
npm install -g [email protected]
Setelah instalasi, jalankan perintah berikut untuk memverifikasi versi Elm.
C:\Users\dell>elm --version
0.18.0
Step 2 − Install the Editor
Lingkungan pengembangan yang digunakan di sini adalah Visual Studio Code (platform Windows).
Visual Studio Code adalah IDE open source dari Visual Studio. Ini tersedia untuk platform Mac OS X, Linux dan Windows. VSCode tersedia di
Instalasi di Windows
Di bagian ini, kita akan membahas langkah-langkah untuk menginstal Elm di Windows.
Unduh
Klik dua kali pada VSCodeSetup.exe untuk meluncurkan proses pengaturan. Ini hanya butuh satu menit.
Anda dapat langsung melintasi jalur file dengan mengklik kanan File → Buka di command prompt. Demikian pula, opsi Reveal in Explorer menunjukkan file di File Explorer.
Instalasi di Mac OS X
Panduan penginstalan khusus Mac OS X Visual Studio Code dapat ditemukan di
Instalasi di Linux
Panduan penginstalan khusus Linux Visual Studio Code dapat ditemukan di
Step 4 − Install the elm Extension
Instal ekstensi elm di VSCode seperti yang ditunjukkan di bawah ini.
Elm REPL
REPL adalah singkatan dari Read Eval Print Loop. Ini mewakili lingkungan komputer seperti konsol Windows atau shell Unix / Linux di mana perintah dimasukkan dan sistem merespons dengan keluaran dalam mode interaktif.
Elm dibundel dengan lingkungan REPL. Itu melakukan tugas-tugas berikut -
Baca - Membaca input pengguna, mem-parsing input ke dalam struktur data elm, dan menyimpannya dalam memori.
Evaluasi - Mengambil dan mengevaluasi struktur data.
Cetak - Mencetak hasilnya.
Loop - Ulangi perintah di atas hingga pengguna keluar. Gunakan perintah: keluar untuk keluar dari REPL dan kembali ke terminal.
Contoh sederhana untuk menambahkan dua angka di REPL ditunjukkan di bawah ini -
Buka terminal VSCode dan ketik perintah elm REPL.
Terminal REPL menunggu pengguna memasukkan beberapa masukan. Masukkan ekspresi berikut 10 + 20. Lingkungan REPL memproses input seperti yang diberikan di bawah ini -
Membaca nomor 10 dan 20 dari pengguna.
Mengevaluasi menggunakan operator +.
Mencetak hasil sebagai 30.
Loop untuk masukan pengguna berikutnya. Di sini kita keluar dari loop.
Bab ini membahas bagaimana menulis program sederhana di elm.
Step 1 − Create a directory HelloApp in VSCode
Sekarang, buat file - Hello.elm di direktori ini.
Diagram di atas menunjukkan folder proyek HelloApp dan terminal dibuka di VSCode.
Step 2 − Install the necessary elm packages
Manajer paket di elm adalah elm-package . Instal paket elm-lang / html . Paket ini akan membantu kami menampilkan keluaran kode elm di browser.
Lintasi HelloApp folder proyek dengan mengklik kanan pada File → Buka di command prompt di VSCode.
Jalankan perintah berikut di jendela terminal -
C:\Users\dell\Elm\HelloApp> elm-package install elm-lang/html
File / folder berikut ditambahkan ke direktori proyek saat menginstal paket.
- elm-package.json (file), menyimpan data meta proyek
- elm-stuff (folder), menyimpan paket eksternal
Pesan berikut akan muncul setelah paket berhasil diinstal.
Step 3 − Add the following code to the Hello.elm file
-- importing Html module and the function text
import Html exposing (text)
-- create main method
main =
-- invoke text function
text "Hello Elm from TutorialsPoint"
Program di atas akan menampilkan pesan string Hello Elm from TutorialsPoint di browser.
Untuk ini, kita perlu mengimpor fungsinya text dalam Htmlmodul. Fungsi teks digunakan untuk mencetak nilai string apa pun di browser. Metode utama adalah titik masuk ke suatu program. The utama metode memanggil teks fungsi dan melewati nilai string untuk itu.
Step 4 − Compile the project
Jalankan perintah berikut di jendela terminal VSCode.
elm make Hello.elm
Output dari perintah di atas seperti yang ditunjukkan di bawah ini -
//update path to the proj folder in the command elm make
C:\Users\dell\elm\HelloApp>elm make Hello.elm
Success! Compiled 38 modules.
Successfully generated index.html
Perintah di atas akan menghasilkan file index.htmlmengajukan. Kompilator elm mengonversi file .elm menjadi JavaScript dan menyematkannya diindex.html mengajukan.
Step 5 − Open the index.html in the browser
Buka file index.html di browser apa pun. Outputnya akan seperti yang ditunjukkan di bawah ini -
Komentar di Elm
Komentar adalah cara untuk meningkatkan keterbacaan program. Komentar dapat digunakan untuk memasukkan informasi tambahan tentang program seperti pembuat kode, petunjuk tentang konstruksi fungsi, dll. Komentar diabaikan oleh kompilator.
Elm mendukung jenis komentar berikut -
Komentar satu baris (-) - Teks apa pun di antara - dan akhir baris dianggap sebagai komentar.
Komentar beberapa baris ({- -}) - Komentar ini dapat mencakup beberapa baris.
Ilustrasi
-- this is single line comment
{- This is a
Multi-line comment
-}
Garis dan Indentasi
Elm tidak memberikan tanda kurung untuk menunjukkan blok kode untuk definisi fungsi atau kontrol aliran. Blok kode dilambangkan dengan indentasi baris, yang diterapkan secara kaku. Semua pernyataan di dalam blok harus menjorok ke dalam jumlah yang sama. Misalnya -
module ModuleIf exposing (..)
x = 0
function1 =
if x > 5 then
"x is greater"
else
"x is small"
Namun, blok berikut menghasilkan kesalahan -
-- Create file ModuleIf.elm
module ModuleIf exposing (..)
x = 0
function1 =
if x > 5 then
"x is greater"
else --Error:else indentation not at same level of if statement
"x is small"
Jadi, di Elm semua garis kontinu yang diindentasi dengan jumlah spasi yang sama akan membentuk satu blok.
C:\Users\admin>elm repl
---- elm-repl 0.18.0 -----------------------------------------------------------
:help for help, :exit to exit, more at
<https://github.com/elm-lang/elm-repl>
---------------------------------------
-----------------------------------------
> import ModuleIf exposing(..) -- importing module from ModuleIf.elm file
>function1 -- executing function from module
-- SYNTAX PROBLEM ---------------------------------------------------
I need whitespace, but got stuck on what looks like a new declaration.
You are either missing some stuff in the declaration above or just need to add some spaces here:
7| else
^
I am looking for one of the following things:
whitespace
Sistem Jenis mewakili berbagai jenis nilai yang didukung oleh bahasa. Sistem Jenis memeriksa validitas nilai yang diberikan, sebelum disimpan atau dimanipulasi oleh program. Ini memastikan bahwa kode berperilaku seperti yang diharapkan. Sistem Jenis lebih jauh memungkinkan untuk petunjuk kode yang lebih kaya dan dokumentasi otomatis juga.
Elm adalah bahasa yang diketik secara statis. Elm memiliki tipe yang mirip dengan bahasa lain.
Jumlah
The Nomor tipe data mewakili nilai-nilai numerik. Sistem tipe Elm mendukung tipe numerik berikut -
No Sr | Tipe | Contoh |
---|---|---|
1 | nomor - Menyimpan nomor apa pun | 7 adalah tipe angka |
2 | Float - Menyimpan nilai pecahan | 7/2 memberikan 3.5 hasil sebagai Float |
3 | Int - Menyimpan nilai non-pecahan | 7 // 2 memberikan 3 hasil sebagai Int |
Jenis nomor mengakomodasi kedua nilai pecahan dan non-pecahan. Buka REPL elm dan coba contoh yang diberikan di bawah ini -
C:\Users\admin>elm repl
---- elm-repl 0.18.0
---------------------------------------------
--------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
------------------------------------------
--------------------------------------
> 7
7 : number
> 7/2
3.5 : Float
> 7//2
3 : Int
>
String dan Char
The String tipe data yang digunakan untuk mewakili urutan karakter. The Char tipe data yang digunakan untuk mewakili satu karakter. Nilai string ditentukan dalam tanda kutip ganda "dan nilai Char diapit dalam tanda kutip tunggal '.
No Sr | Tipe | Contoh |
---|---|---|
1 | String - Menyimpan urutan karakter | "TutorialsPoint" |
2 | Char - Menyimpan nilai pecahan | 'T' |
Buka REPL elm dan coba contoh yang diberikan di bawah ini -
C:\Users\admin>elm repl
---- elm-repl 0.18.0 ---------------------------------------
--------------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
--------------------------------------
------------------------------------------
> "TutorialsPoint"
"TutorialsPoint" : String
> 'T'
'T' : Char
Bool
Tipe data Bool di Elm hanya mendukung dua nilai - True dan False. Kata kunci Bool digunakan untuk mewakili nilai Boolean.
No Sr | Tipe | Contoh |
---|---|---|
1 | Bool - Menyimpan nilai Benar atau Salah | 1 == 1 mengembalikan True |
Buka REPL elm dan coba contoh yang diberikan di bawah ini -
C:\Users\dell\elm>elm repl
---- elm-repl 0.18.0 -----------------------------------
------------------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
----------------------------------------
----------------------------------------
> True
True : Bool
> False
False : Bool
> 1==1
True : Bool
> 1==2
False : Bool
> 1 /= 2 -- not equal
True : Bool
> not True
False : Bool
> not False
True : Bool
Jenis Kustom
Elm mendukung pembuatan tipe yang ditentukan pengguna. Misalnya, pertimbangkan aplikasi pembayaran. Aplikasi perlu menyimpan berbagai mode pembayaran - kartu kredit, kartu debit, dan perbankan bersih. Ini dapat dicapai dengan menentukan jenis kustom dan membatasi nilainya pada tiga mode pembayaran yang dapat diterima.
Contoh berikut menunjukkan cara membuat tipe kustom.
> type PaymentMode = CreditCard|NetBanking|DebitCard
> payment1 = CreditCard
CreditCard : Repl.PaymentMode
> payment2 = DebitCard
DebitCard : Repl.PaymentMode
> payment3 = UPI
-- NAMING ERROR ---------------------------------------------- repl-temp-000.elm
Cannot find variable `UPI`
7| payment3 = UPI
Pada contoh di atas, kami membuat jenis kustom PaymentMode. Variabel pembayaran1 dan pembayaran2 ditetapkan ke nilai PaymentMode. Jika nilai yang ditetapkan ke variabel tidak cocok dengan nilai apa pun yang ditentukan oleh jenis PaymentMode, aplikasi akan memunculkan kesalahan sintaksis.
Jenis Data Terstruktur
Tipe data terstruktur dapat digunakan untuk menyimpan beberapa nilai dalam format terstruktur. Elm mendukung tipe data terstruktur berikut -
- Tuple
- List
- Record
- Record
Ini akan dibahas secara rinci di bab-bab selanjutnya.
Variabel, menurut definisi, adalah "ruang bernama dalam memori" yang menyimpan nilai. Dengan kata lain, ini bertindak sebagai wadah untuk nilai-nilai dalam suatu program. Variabel membantu program untuk menyimpan dan memanipulasi nilai.
Variabel di Elm dikaitkan dengan tipe data tertentu. Jenis data menentukan ukuran dan tata letak memori variabel, kisaran nilai yang dapat disimpan dalam memori itu dan rangkaian operasi yang dapat dilakukan pada variabel.
Variable Naming-Rules
Pada bagian ini, kita akan belajar tentang Aturan Penamaan Variabel.
- Nama variabel dapat terdiri dari huruf, angka, dan karakter garis bawah.
- Nama variabel tidak boleh dimulai dengan digit. Ini harus dimulai dengan huruf atau garis bawah.
- Huruf besar dan kecil berbeda karena Elm peka huruf besar / kecil.
Deklarasi Variabel di Elm
Sintaks tipe untuk mendeklarasikan variabel di Elm diberikan di bawah ini -
Sintaks 1
variable_name:data_type = value
Sintaks “:” (dikenal sebagai anotasi tipe) digunakan untuk mengaitkan variabel dengan tipe data.
Sintaks 2
variable_name = value-- no type specified
Tipe data adalah opsional saat mendeklarasikan variabel di Elm. Dalam hal ini, tipe data variabel disimpulkan dari nilai yang diberikan padanya.
Ilustrasi
Contoh ini menggunakan editor VSCode untuk menulis program elm dan menjalankannya menggunakan repl elm.
Step 1 − Create a project folder - VariablesApp. Create a Variables.elm file in the project folder.
Tambahkan konten berikut ke file.
module Variables exposing (..) //Define a module and expose all contents in the module
message:String -- type annotation
message = "Variables can have types in Elm"
Program mendefinisikan variabel modul. Nama modul harus sama dengan nama file program elm. Sintaks (..) digunakan untuk mengekspos semua komponen dalam modul.
Program ini mendeklarasikan pesan variabel dari tipe String .
Step 2 − Execute the program.
- Ketik perintah berikut di terminal VSCode untuk membuka elm REPL.
elm repl
- Jalankan pernyataan elm berikut di terminal REPL.
> import Variables exposing (..) --imports all components from the Variables module
> message --Reads value in the message varaible and prints it to the REPL
"Variables can have types in Elm":String
>
Ilustrasi
Gunakan Elm REPL untuk mencoba contoh berikut.
C:\Users\dell\elm>elm repl
---- elm-repl 0.18.0 ---------------------------------------
--------------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
-------------------------------------
------------------------------------------
> company = "TutorialsPoint"
"TutorialsPoint" : String
> location = "Hyderabad"
"Hyderabad" : String
> rating = 4.5
4.5 : Float
Di sini, variabel perusahaan dan lokasi adalah variabel String dan peringkat adalah variabel Float.
REPL elm tidak mendukung anotasi tipe untuk variabel. Contoh berikut menampilkan kesalahan jika tipe data disertakan saat mendeklarasikan variabel.
C:\Users\dell\elm>elm repl
---- elm-repl 0.18.0 -----------------------------------------
------------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
----------------------------------------
----------------------------------------
> message:String
-- SYNTAX PROBLEM -------------------------------------------- repl-temp-000.elm
A single colon is for type annotations. Maybe you want :: instead? Or maybe you
are defining a type annotation, but there is whitespace before it?
3| message:String
^
Maybe <http://elm-lang.org/docs/syntax> can help you figure it out.
Untuk menyisipkan jeda baris saat menggunakan elm REPL, gunakan sintaks \ seperti yang ditunjukkan di bawah ini -
C:\Users\dell\elm>elm repl
---- elm-repl 0.18.0 --------------------------------------
---------------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
------------------------------------------
--------------------------------------
> company \ -- firstLine
| = "TutorialsPoint" -- secondLine
"TutorialsPoint" : String
Seorang operator mendefinisikan beberapa fungsi yang akan dilakukan pada data. Nilai di mana operator bekerja disebut operan. Perhatikan ungkapan berikut
7 + 5 = 12
Di sini, nilai 7, 5, dan 12 adalah operan, sedangkan + dan = adalah operator.
Operator utama di Elm dapat diklasifikasikan sebagai -
- Arithmetic
- Relational
- Logical
Operator Aritmatika
Asumsikan nilai dalam variabel a dan b masing-masing adalah 7 dan 2.
Tunjukkan Contoh
No Sr | Operator | Deskripsi | Contoh |
---|---|---|---|
1 | + (Penambahan) | mengembalikan jumlah operan | a + b adalah 9 |
2 | -(Pengurangan) | mengembalikan selisih nilai | ab adalah 5 |
3 | * (Perkalian) | mengembalikan produk dari nilai | a * b adalah 14 |
4 | / (Divisi Float) | melakukan operasi pembagian dan mengembalikan hasil bagi float | a / b adalah 3,5 |
5 | // (Divisi Integer) | melakukan operasi pembagian dan mengembalikan hasil bagi integer | a // b adalah 3 |
6 | % (Modulus) | melakukan operasi pembagian dan mengembalikan sisanya | a% b adalah 1 |
Operator Relasional
Operator Relasional menguji atau menentukan jenis hubungan antara dua entitas. Operator ini digunakan untuk membandingkan dua atau lebih nilai. Operator relasional mengembalikan nilai Boolean, yaitu benar atau salah.
Asumsikan nilai a adalah 10 dan b adalah 20.
Tunjukkan Contoh
No Sr | Operator | Deskripsi | Contoh |
---|---|---|---|
1 | > | Lebih besar dari | (a> b) adalah Salah |
2 | < | Lebih kecil dari | (a <b) Benar |
3 | > = | Lebih dari atau sama dengan | (a> = b) adalah False |
4 | <= | Lebih kecil dari atau sama dengan | (a <= b) Benar |
5 | == | Persamaan | (a == b) salah |
6 | ! = | Tidak sama | (a! = b) Benar |
Jenis yang Sebanding
Operator perbandingan seperti> = atau <bekerja dengan tipe yang sebanding. Ini didefinisikan sebagai angka, karakter, string, dan daftar, tupel. Jenis pembanding di kedua sisi operator harus sama.
No Sr | Jenis yang Sebanding | Contoh |
---|---|---|
1 | jumlah | 7> 2 memberikan True |
2 | karakter | 'a' == 'b' menghasilkan False |
3 | tali | "halo" == "halo" berarti Benar |
4 | tupel | (1, "One") == (1, "One") menghasilkan True |
5 | daftar | [1,2] == [1,2] memberikan True |
Buka REPL elm dan coba contoh yang ditunjukkan di bawah ini -
C:\Users\admin>elm repl
---- elm-repl 0.18.0 -----------------------------------------------------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
--------------------------------------------------------------------------------
> 7>2
True : Bool
> 7.0>2
True : Bool
> 7.0<2.0
False : Bool
> 'a' > 'b'
False : Bool
> 'a' < 'b'
True : Bool
> "a" < "b"
True : Bool
> (1,2) > (2,3)
False : Bool
> ['1','3'] < ['2','1']
True : Bool
>
Operator Logis
Operator Logis digunakan untuk menggabungkan dua atau lebih kondisi. Operator logika juga mengembalikan nilai Boolean.
Tunjukkan Contoh
No Sr | Operator | Deskripsi | Contoh |
---|---|---|---|
1 | && | Operator mengembalikan nilai benar hanya jika semua ekspresi yang ditentukan mengembalikan nilai benar | (10> 5) && (20> 5) mengembalikan True |
2 | || | Operator mengembalikan nilai benar jika setidaknya satu dari ekspresi yang ditentukan mengembalikan nilai benar | (10 <5) || (20> 5) mengembalikan True |
3 | tidak | Operator mengembalikan kebalikan dari hasil ekspresi. Untuk Misalnya:! (> 5) mengembalikan salah. | not (10 <5) mengembalikan True |
4 | xor | Operator mengembalikan nilai true hanya jika tepat satu masukan mengembalikan true. Operator mengembalikan nilai salah jika kedua ekspresi kembali benar. | xor (10> 5) (20> 5) mengembalikan nilai salah |
Struktur pengambilan keputusan mensyaratkan bahwa programmer menentukan satu atau lebih kondisi untuk dievaluasi atau diuji oleh program, bersama dengan pernyataan atau pernyataan yang akan dieksekusi jika kondisi ditentukan benar, dan secara opsional, pernyataan lain akan dieksekusi jika kondisi ditentukan sebagai salah.
Di bawah ini adalah bentuk umum dari struktur pengambilan keputusan tipikal yang ditemukan di sebagian besar bahasa pemrograman
Konstruksi pengambilan keputusan mengevaluasi kondisi sebelum instruksi dieksekusi. Konstruksi pengambilan keputusan di Elm diklasifikasikan sebagai berikut -
No Sr | Pernyataan | Deskripsi |
---|---|---|
1 | jika ... maka ... pernyataan lain | Pernyataan if terdiri dari ekspresi Boolean diikuti oleh kemudian yang dijalankan jika ekspresi kembali benar dan yang lain dijalankan jika ekspresi kembali salah |
2 | pernyataan if bersarang | Anda dapat menggunakan satu jika ... lalu ... lain di dalam jika lain. |
3 | pernyataan kasus | Menguji nilai variabel terhadap daftar nilai. |
jika ... maka ... lain Pernyataan
Itu if…thenmembangun mengevaluasi kondisi sebelum blok kode dieksekusi. Jika ekspresi Boolean bernilai true, maka blok kode di dalam pernyataan then akan dieksekusi. Jika ekspresi Boolean bernilai false, maka blok kode di dalam pernyataan else akan dieksekusi.
Berbeda dengan bahasa pemrograman lainnya, di Elm kita harus menyediakan cabang else. Jika tidak, Elm akan membuat kesalahan.
Sintaksis
if boolean_expression then statement1_ifTrue else statement2_ifFalse
Ilustrasi
Coba contoh berikut di terminal REPL.
> if 10>5 then "10 is bigger" else "10 is small"
"10 is bigger" : String
Jika Bersarang
Pernyataan if bersarang berguna untuk menguji beberapa kondisi. Sintaks dari pernyataan if bersarang diberikan di bawah ini -
if boolean_expression1 then statement1_ifTrue else if boolean_expression2 then statement2_ifTrue else statement3_ifFalse
Ilustrasi
Coba contoh berikut di Elm REPL -
> score=80
80 : number
> if score>=80 then "Outstanding" else if score > = 70 then "good" else "average"
"Outstanding" : String
Pernyataan kasus
Pernyataan kasus dapat digunakan untuk menyederhanakan pernyataan if then else. Sintaks dari pernyataan kasus seperti yang diberikan di bawah ini -
case variable_name of
constant1 -> Return_some_value
constant2 -> Return_some_value
_ -> Return_some_value if none of the above values match
Pernyataan kasus memeriksa apakah nilai variabel cocok dengan sekumpulan konstanta yang telah ditentukan sebelumnya dan mengembalikan nilai yang sesuai. Perhatikan bahwa nilai yang dikembalikan oleh setiap kasus harus berjenis sama. Jika nilai variabel tidak cocok dengan salah satu konstanta yang diberikan, kontrol akan diteruskan ke * default * (dilambangkan dengan // _) dan nilai terkait dikembalikan.
Ilustrasi
Coba contoh berikut di Elm REPL -
> n = 10
10 : number
> case n of \
| 0 -> "n is Zero" \
| _ -> "n is not Zero"
"n is not Zero" : String
Potongan kode di atas memeriksa apakah nilai n adalah nol. Kontrol dilewatkan ke default, yang mengembalikan string "n bukan Nol".
Elm adalah bahasa pemrograman fungsional. Elm menggunakan konsep rekursi sebagai alternatif dari konstruksi perulangan tradisional.
Bab ini membahas tentang konsep rekursi.
Pengulangan
Beberapa bahasa pemrograman komputer mengizinkan modul atau fungsi untuk memanggil dirinya sendiri. Teknik ini dikenal sebagai rekursi.
Ilustrasi
Dalam program ini, kita akan melihat bagaimana menggunakan rekursi untuk menampilkan hello sebanyak lima kali.
Step 1 − Create a file Loop.elm
Buat Loop modul dan tentukan fungsi sayHello. Fungsi sayHello mengambil nilai integer sebagai masukan dan mengembalikan nilai string.
module Loop exposing(..)
//function signature
sayHello:Int ->String
//function implementation
sayHello n =
case n of
1 -> "Hello:1 "
_ -> "Hello:" ++ toString (n) ++ " " ++ sayHello(n-1)
Fungsi sayHello memeriksa apakah parameter yang dilewatkan adalah 1. Jika parameternya 1, maka fungsi akan kembali, jika tidak maka akan membuat string Halo dan memanggil fungsi yang sama.
Step 2 − Invoke sayHello from REPL
Buka REPL elm dari folder proyek saat ini (lokasi file Loop.elm).
//import the module Loop
> import Loop exposing(..)
//invoke the sayHello function with parameter value as 5
> sayHello 5
"Hello:5 Hello:4 Hello:3 Hello:2 Hello:1 Hello:0 " : String
>
Ilustrasi
Contoh berikut mencetak jumlah n angka menggunakan rekursi.
> sumOfNos n =\
| if n==0 then 0 \
| else (n) + sumOfNos (n-1)
<function> : number -> number1
Di REPL elm, kami membuat fungsi sumOfNos yang mengambil nomor input dan menjumlahkan semua angka dari 0 ke angka itu.
Misalnya jika kita melewatkan input sebagai 5, maka akan dijumlahkan 1 + 2 + 3 + 4 + 5 yaitu 15 .
> ssumOfNos 5
15 : number
Output dari program ditunjukkan di atas.
Fungsi adalah blok bangunan program Elm. Fungsi adalah sekumpulan pernyataan untuk melakukan tugas tertentu.
Fungsi mengatur program menjadi blok-blok kode logis. Setelah ditentukan, fungsi dapat dipanggil ke kode akses. Ini membuat kode dapat digunakan kembali. Selain itu, fungsi memudahkan untuk membaca dan memelihara kode program.
Langkah-langkah untuk menggunakan suatu fungsi
Ada tiga langkah untuk menggunakan suatu fungsi -
Deklarasi Fungsi
Deklarasi fungsi memberi tahu compiler tentang nama fungsi, tipe kembalian, dan parameter. Sintaks untuk mendeklarasikan fungsi diberikan di bawah ini -
fn_name:data_type_of_the_parameters ->return_type
Deklarasi fungsi menentukan berikut ini -
Nama fungsinya.
Jenis data dari parameter. Ini opsional karena suatu fungsi mungkin memiliki atau tidak memiliki parameter.
Jenis data dari nilai, yang akan dikembalikan oleh fungsi. Fungsi di Elm harus selalu mengembalikan nilai karena Elm adalah bahasa pemrograman fungsional. Tidak seperti fungsi dalam bahasa pemrograman lainnya, fungsi Elm tidak menggunakan kata kunci return untuk mengembalikan nilai.
Definisi Fungsi atau Implementasi Fungsi
Definisi fungsi memberikan tubuh sebenarnya dari fungsi tersebut. Definisi fungsi menentukan bagaimana tugas tertentu akan dilakukan. Sintaks untuk mendefinisikan suatu fungsi seperti yang diberikan di bawah ini -
fn_name parameter1 parameter2 = statements
Memanggil atau Memanggil Fungsi
Sebuah fungsi harus dipanggil untuk menjalankannya. Sintaks untuk memanggil fungsi diberikan di bawah ini -
fn_name parameter1 parameter2
Ilustrasi
Kode berikut mendefinisikan sebuah fungsi penyapa. Fungsi mengembalikan string "Halo".
> greet = \
| if True then \
| "Hello" \
| else \
| "GoodBye"
"Hello" : String
> greet
"Hello" : String
Fungsi Parameter
Parameter adalah mekanisme untuk meneruskan nilai ke suatu fungsi. Nilai parameter diteruskan ke fungsi pada saat pemanggilan fungsi.
Ilustrasi 1
Contoh berikut mendefinisikan fungsi fn_add . Fungsi tersebut menerima dua angka sebagai parameter dan mengembalikan jumlahnya. Coba yang berikut ini di elm REPL -
> fn_add x y = x+y
<function> : number -> number -> number
> fn_add 10 20
30 : number
Ilustrasi 2
Contoh berikut mendefinisikan fungsi sayHello. Fungsi sayHello menerima dan mengembalikan nilai String sebagai parameter dan mengembalikan String.
> sayHello name = "Hello "++ name
<function> : String -> String
> sayHello "Tutorialspoint"
"Hello Tutorialspoint" : String
>
Operator Pipa
Untuk memahami operator pipa |>, mari kita pertimbangkan contoh di mana kita memiliki daftar string yang berbeda ["a", "b", "c"] . Sekarang kita membutuhkan satu string, yang dipisahkan oleh -
Contoh berikut menunjukkan bagaimana melakukannya dengan String.join
> String.join "-" ["a","b","c","d","e","f"]
"a-b-c-d-e-f" : String
Tindakan yang sama dapat dilakukan dengan menggunakan operator pipa |>. Operator pipa dapat digunakan untuk menghubungkan beberapa panggilan fungsi.
> ["a","b","c","d","e","f"] |> String.join "-"
"a-b-c-d-e-f" : String
> ["a","b","c","d","e","f"] |> List.reverse |> String.join "-"
"f-e-d-c-b-a" : String
Dalam contoh pertama, kami merangkai metode daftar untuk digabungkan. Dalam kasus kedua, daftar yang sama disalurkan ke fungsi terbalik dan setelah itu disalurkan untuk bergabung. Jadi, daftar tersebut ditampilkan secara terbalik dan digabungkan.
Urutan karakter Unicode disebut String. Di Elm, string diapit tanda kutip ganda "" . String adalah sekumpulan teks seperti yang ditunjukkan di bawah ini.
> "TutorialsPoint"
"TutorialsPoint" : String
> location = "Hyderabad" --variable
"Hyderabad" : String
> location
"Hyderabad" : String
>
Fungsi String
Beberapa fungsi umum yang dapat digunakan untuk melakukan kueri atau memanipulasi nilai string diberikan di bawah ini. Gunakan REPL untuk mencoba contoh yang diberikan di bawah ini.
Sr Tidak | metode | Deskripsi |
---|---|---|
1 | isEmpty: String -> Bool | string cek kosong |
2 | membalikkan: String -> String | membalikkan string masukan |
3 | panjang: String -> Int | mengembalikan panjang integer |
4 | tambahkan: String -> String -> String | menambahkan dua string dan mengembalikan string baru |
5 | tambahkan: String -> Sconcat: List String -> String | menambahkan daftar string dan mengembalikan string baru |
6 | split: String -> String -> List String | membagi string input menggunakan pemisah yang diberikan, mengembalikan daftar string |
7 | irisan: Int -> Int -> String -> String | mengembalikan substring yang diberi awal, indeks akhir dan string input |
8 | berisi: String -> String -> Bool | mengembalikan nilai true jika string kedua berisi yang pertama |
9 | toInt: String -> Result.Result String Int | mengurai String ke Integer |
10 | toInt: String -> Result.Result String Int | mengurai String ke Integer |
11 | toFloat: String -> Result. Hasil String Float | mengurai String untuk mengapung |
12 | fromChar: Char -> String | membuat string dari karakter tertentu. |
13 | toList: String -> List Char | mengonversi string menjadi daftar karakter |
14 | fromList: List Char -> String | mengubah daftar karakter menjadi String |
15 | toUpper: String -> String | mengubah string masukan menjadi huruf besar |
16 | trim: String -> String | menghilangkan spasi di kedua sisi string. |
17 | filter: (Char -> Bool) -> String -> String | filter sekumpulan karakter dari string input |
18 | peta: (Char -> Char) -> String -> String | mengubah setiap karakter dalam string input |
kosong
Fungsi ini dapat digunakan untuk menentukan apakah sebuah string kosong. Fungsi ini mengembalikan True jika String yang diberikan kosong.
Sintaksis
String.isEmpty String_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.isEmpty
<function> : String -> Bool
Tanda tangan fungsi menunjukkan Bool sebagai tipe kembalian dan tipe input sebagai String -
Ilustrasi
> String.isEmpty ""
True : Bool
> String.isEmpty "Tutorialspoint"
False : Bool
> location = "Hyderabad"
"Hyderabad" : String
> String.isEmpty location
False : Bool
balik
Fungsi ini membalikkan string.
Sintaksis
String.reverse String_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.reverse
<function> : String -> String
Tanda tangan fungsi menunjukkan String sebagai tipe kembalian dan tipe input sebagai String -
Ilustrasi
> String.reverse "TutorialsPoint"
"tnioPslairotuT" : String
panjangnya
Fungsi ini mengembalikan panjang string.
Sintaksis
String.length String_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.length
<function-> : String -> Int
Tanda tangan fungsi menunjukkan Int sebagai tipe kembalian dan tipe input sebagai String.
Ilustrasi
> String.length "Mohtashim"
9 : Int
menambahkan
Fungsi ini mengembalikan string baru dengan menambahkan dua string.
Sintaksis
String.append String_value1 String_value2
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.append
<function-> : String -> String -> String
Tanda tangan menunjukkan dua parameter input String dan satu parameter output String
Ilustrasi
> String.append "Tutorials" "Point"
TutorialsPoint : String
concat
Fungsi ini mengembalikan string baru dengan menggabungkan banyak string menjadi satu.
Sintaksis
String.concat [String1,String2,String3]
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.concat
<function> : List String -> String
Tanda tangan menunjukkan Daftar parameter input String dan tipe kembali String
Ilustrasi
> String.concat ["Hello","Tutorials","Point"]
HelloTutorialsPoint : String
membagi
Fungsi ini memisahkan string menggunakan pemisah yang ditentukan.
Sintaksis
String.split string_seperator String_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.split
<function> : String -> String -> List String
Tanda tangan menunjukkan dua input parameter String dan output sebagai daftar tipe string.
Ilustrasi
> String.split "," "Hello,Tutorials,Point"
["Hello","Tutorials","Point"] : List String
mengiris
Fungsi ini mengembalikan substring yang diberi indeks awal dan akhir. Indeks negatif diambil mulai dari akhir daftar. Nilai indeks dimulai dari nol.
Sintaksis
String.slice start_index end_index String_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.slice
<function> : Int -> Int -> String -> String
Tanda tangan menunjukkan tiga parameter masukan dan satu jenis kembali.
Ilustrasi
> String.slice 0 13 "TutorialsPoint"
"TutorialsPoin" : String
mengandung
Fungsi ini mengembalikan True jika string kedua berisi yang pertama.
Sintaksis
String.contains string1 string2
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.contains
<function> : String -> String -> Bool
Tanda tangan show bool return type dan dua parameter input
Ilustrasi
> String.contains "Point" "TutorialsPoint"
True : Bool
toInt
Fungsi ini mengubah string menjadi int.
Sintaksis
String.toInt string_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.toInt
<function> : String -> Result.Result String Int
Karena toInt dapat mengembalikan kesalahan, tipe yang dikembalikan adalah Result, yaitu String atau Int.
Ilustrasi
> String.toInt "20"
Ok 20 : Result.Result String Int
> String.toInt "abc"
Err "could not convert string 'abc' to an Int" : Result.Result String Int
toFloat
Fungsi ini mengubah string menjadi float.
Sintaksis
String.toFloat string_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.toFloat
<function> : String -> Result.Result String Float
Karena toFloat dapat mengembalikan kesalahan, jenis yang dikembalikan adalah Hasil, yaitu String atau Float.
Ilustrasi
> String.toFloat "20.50"
Ok 20.5 : Result.Result String Float
> String.toFloat "abc"
Err "could not convert string 'abc' to a Float" : Result.Result String Float
fromChar
Fungsi ini membuat string dari karakter tertentu.
Sintaksis
String.fromChar character_value
Untuk memeriksa tanda tangan tipe fungsi berikut di elm REPL -
> String.fromChar
<function> : Char -> String
Tanda tangan menunjukkan String sebagai tipe kembalian dan input sebagai tipe Char
Ilustrasi
> String.fromChar 'c'
"c" : String
toList
Fungsi ini mengubah string menjadi daftar karakter.
Sintaksis
String.toList string_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.toList
<function> : String -> List Char
Tanda tangan menunjukkan fungsi mengembalikan daftar karakter dan mengambil input string.
Ilustrasi
> String.toList "tutorialspoint"
['t','u','t','o','r','i','a','l','s','p','o','i','n','t'] : List Char
fromList
Fungsi ini mengubah daftar karakter menjadi String.
Sintaksis
String.fromList list_of_characters
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.fromList
<function> : List Char -> String
Tanda tangan menunjukkan fungsi mengembalikan daftar karakter dan mengambil input string.
Ilustrasi
> String.fromList ['h','e','l','l','o']
"hello" : String
toUpper
Fungsi ini mengubah string menjadi huruf besar semua.
Sintaksis
String.toUpper String_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.toUpper
<function> : String -> String
Ilustrasi
> String.toUpper "hello"
"HELLO" : String
toLower
Fungsi ini mengubah string menjadi huruf kecil semua.
Sintaksis
String.toLower String_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.toLower
<function> : String -> String
Ilustrasi
> String.toLower "AbCd"
"abcd" : String
memangkas
Fungsi ini menghilangkan spasi di kedua sisi string.
Sintaksis
String.trim String_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.trim
<function> : String -> String
Ilustrasi
> String.trim "tutorialspoint "
"tutorialspoint" : String
Saring
Fungsi ini memfilter sekumpulan karakter dari input String. Pertahankan hanya karakter yang lulus ujian.
Sintaksis
String.filter test_function string_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.filter
<function> : (Char -> Bool) -> String -> String
Filter tanda tangan menunjukkan mengambil dua parameter input dan mengembalikan String. Parameter pertama adalah sebuah fungsi, yang memiliki input Char dan mengembalikan Bool.
Ilustrasi
Dalam contoh, kami mengirimkan Char.isUpper sebagai parameter ke metode filter; itu mengembalikan semua karakter huruf besar seperti yang ditunjukkan di bawah ini.
> import Char
> String.filter Char.isUpper "abcDEF"
"DEF" : String
peta
Fungsi ini mengambil String dan mengubah setiap karakter dalam string.
Sintaksis
String.filter mapping_function string_value
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> String.map
<function> : (Char -> Char) -> String -> String
Ilustrasi
Contoh berikut menggantikan karakter o dengan @ -
> String.map (\c -> if c == 'o' then '@' else c) "TutorialsPoint"
"Tut@rialsP@int" : String
Struktur data List, Tuples dan Record dapat digunakan untuk menyimpan kumpulan nilai.
Bab ini membahas cara menggunakan List di Elm.
Daftar adalah kumpulan nilai homogen. Nilai dalam daftar semuanya harus dari tipe data yang sama.
Pertimbangkan batasan berikut saat menggunakan variabel untuk menyimpan nilai -
Variabel bersifat skalar. Dengan kata lain, pada saat deklarasi sebuah variabel hanya dapat menampung satu nilai. Ini berarti bahwa untuk menyimpan nilai n dalam sebuah program, diperlukan n deklarasi variabel. Oleh karena itu, penggunaan variabel tidak layak ketika seseorang perlu menyimpan kumpulan nilai yang lebih besar.
Variabel dalam program dialokasikan memori dalam urutan acak, sehingga menyulitkan untuk mengambil / membaca nilai dalam urutan deklarasinya.
Sintaksis
List_name = [value1,value2,value3.....valuen]
Ilustrasi
Contoh berikut menunjukkan cara menggunakan List di Elm. Coba contoh ini di elm REPL -
> myList1 = [10,20,30]
[10,20,30] : List number
> myList2 = ["hello","world"]
["hello","world"] : List String
Jika kita mencoba menambahkan nilai dari tipe yang berbeda ke dalam daftar, kompilator akan memunculkan kesalahan ketidakcocokan tipe. Ini ditunjukkan di bawah.
> myList = [1,"hello"]
-- TYPE MISMATCH
---------------------------------------------
repl-temp-000.elm
The 1st and 2nd entries in this list are different types of values.
4| [1,"hello"]
^^^^^^^
The 1st entry has this type:
number
But the 2nd is:
String
Daftar operasi
Tabel berikut memperlihatkan operasi umum pada Daftar -
Sr Tidak | metode | Deskripsi |
---|---|---|
1 | isEmpty: Daftar a -> Bool | memeriksa apakah daftar kosong |
2 | terbalik: Daftar a -> Bool | membalikkan daftar masukan |
3 | panjang: Daftar a -> Int | mengembalikan ukuran daftar |
4 | maksimum: Daftar yang sebanding -> Mungkin. Mungkin sebanding | mengembalikan nilai maksimum |
5 | minimum: Daftar sebanding -> Mungkin.Mungkin sebanding | mengembalikan nilai minimum |
6 | jumlah: Nomor daftar -> nomor | mengembalikan jumlah semua elemen dalam daftar |
7 | produk: Nomor daftar -> nomor | memeriksa apakah daftar kosong |
8 | sort: Daftar yang dapat dibandingkan -> Daftar yang dapat dibandingkan | mengurutkan daftar dalam urutan menaik |
9 | concat: Daftar (Daftar a) -> Daftar a | menggabungkan banyak daftar menjadi satu |
10 | menambahkan: Daftar a -> Daftar a -> Daftar a | menggabungkan dua daftar menjadi satu |
11 | range: Int -> Int -> List Int | mengembalikan daftar nomor dari awal sampai akhir |
12 | filter: (a -> Bool) -> Daftar a -> Daftar a | filter daftar nilai dari daftar masukan |
13 | head: Daftar a -> Mungkin. Mungkin a | mengembalikan elemen pertama dari daftar |
14 | tail :: List a -> Maybe.Maybe (Daftar a) | mengembalikan semua elemen kecuali kepala |
kosong
Fungsi ini mengembalikan nilai true jika daftar kosong.
Sintaksis
List.isEmpty list_name
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.isEmpty
<function> : List a -> Bool
Ilustrasi
> List.isEmpty
<function> : List a -> Bool
> List.isEmpty [10,20,30]
False : Bool
balik
Fungsi ini membalikkan daftar.
Sintaksis
List.reverse list_name
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.reverse
<function> : List a -> List a
Ilustrasi
> List.reverse [10,20,30]
[30,20,10] : List number
panjangnya
Fungsi ini mengembalikan panjang daftar.
Sintaksis
List.length list_name
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.length
<function> : List a -> Int
Ilustrasi
> List.length [10,20,30]
3 : Int
maksimum
Fungsi ini mengembalikan elemen maksimum dalam daftar yang tidak kosong.
Sintaksis
List.maximum list_name
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.maximum
<function> : List comparable -> Maybe.Maybe comparable
Ilustrasi
> List.maximum [10,20,30]
Just 30 : Maybe.Maybe number
> List.maximum []
Nothing : Maybe.Maybe comparable
minimum
Fungsi ini mengembalikan elemen minimum dalam daftar yang tidak kosong.
Sintaksis
List.minimum list_name
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.minimum
<function> : List comparable -> Maybe.Maybe comparable
Ilustrasi
> List.minimum [10,20,30]
Just 10 : Maybe.Maybe number
jumlah
Fungsi ini mengembalikan jumlah semua elemen dalam daftar.
Sintaksis
List.sum list_name
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.sum
<function> : List number -> number
Ilustrasi
> List.sum [10,20,30]
60 : number
produk
Fungsi ini mengembalikan produk dari semua elemen dalam daftar.
Sintaksis
List.product list_name
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
<function> : List number -> number
Ilustrasi
List.product [10,20,30]
6000 : number
menyortir
Fungsi ini mengurutkan nilai dari terendah hingga tertinggi dalam daftar.
Sintaksis
List.sort list_name
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.sort
<function> : List comparable -> List comparable
Ilustrasi
> List.sort [10,20,30]
[10,20,30] : List number
concat
Fungsi ini menggabungkan banyak daftar menjadi satu daftar.
Sintaksis
List.concat [ [list_name1],[list_name2],[list_name3],.....[list_nameN] ]
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.concat
<function> : List (List a) -> List a
Ilustrasi
> List.concat [[10,20], [30,40],[50,60]]
[10,20,30,40,50,60] : List number
menambahkan
Fungsi ini menyatukan dua daftar.
Sintaksis
List.append [list_name1] [list_name2]
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.append
<function> : List a -> List a -> List a
Ilustrasi
> List.append [10,20] [30,40]
[10,20,30,40] : List number
Operator ++ juga dapat digunakan untuk menambahkan daftar ke yang lain. Ini ditunjukkan pada contoh di bawah -
> [10.1,20.2] ++ [30.3,40.4]
[10.1,20.2,30.3,40.4] : List Float
jarak
Fungsi ini membuat daftar angka, setiap elemen bertambah satu. Angka terendah dan tertinggi yang harus ada dalam daftar diteruskan ke fungsi.
Sintaksis
List.range start_range end_range
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.range
<function> : Int -> Int -> List Int
Ilustrasi
> List.range 1 10
[1,2,3,4,5,6,7,8,9,10] : List Int
Saring
Fungsi ini memfilter sekumpulan nilai dari daftar input. Simpan hanya nilai yang lulus ujian.
Sintaksis
List.filter test_function input_list
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.filter
<function> : (a -> Bool) -> List a -> List a
Ilustrasi
Contoh berikut memfilter semua bilangan genap dari daftar input
> List.filter (\n -> n%2==0) [10,20,30,55]
[10,20,30] : List Int
kepala
Fungsi ini mengembalikan elemen pertama dari daftar masukan.
Sintaksis
List.head input_list
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.head
<function> : List a -> Maybe.Maybe a
Ilustrasi
> List.head [10,20,30,40]
Just 10 : Maybe.Maybe number
> List.head []
Nothing : Maybe.Maybe a
ekor
Fungsi ini mengembalikan semua elemen setelah yang pertama dalam daftar.
Sintaksis
List.tail input_list
Untuk memeriksa tanda tangan fungsi, ketik berikut ini di elm REPL -
> List.tail
<function> : List a -> Maybe.Maybe (List a)
Ilustrasi
> List.tail [10,20,30,40,50]
Just [20,30,40,50] : Maybe.Maybe (List number)
> List.tail [10]
Just [] : Maybe.Maybe (List number)
> List.tail []
Nothing : Maybe.Maybe (List a)
Menggunakan Operator Kontra
Operator kontra (::) menambahkan elemen ke depan daftar.
Ilustrasi
> 10::[20,30,40,50]
[10,20,30,40,50] : List number
Elemen baru yang akan ditambahkan dan tipe data dari nilai dalam daftar harus cocok. Kompilator membuat kesalahan jika tipe datanya tidak cocok.
> [1,2,3,4]::[5,6,7,8]
-- TYPE MISMATCH ---------------------------------
------------ repl-temp-000.elm
The right side of (::) is causing a type mismatch.
3| [1,2,3,4]::[5,6,7,8]
^^^^^^^^^
(::) is expecting the right side to be a:
List (List number)
But the right side is:
List number
Hint: With operators like (::) I always check the left side first. If it seems fine,
I assume it is correct and check the right side. So the
problem may be in how the left and right arguments interact.
Daftar tidak dapat diubah
Mari kita periksa apakah daftar tidak dapat diubah di Elm. Daftar pertama myList ketika digabungkan dengan nilai 1 membuat daftar baru dan dikembalikan ke myListCopy . Oleh karena itu, jika kita menampilkan daftar awal, nilainya tidak akan berubah.
> myList = [10,20,30]
[10,20,30] : List number
> myListCopy = 1::myList
[1,10,20,30] : List number
> myList
[10,20,30] : List number
>myList == myListCopy
False : Bool
Terkadang, mungkin ada kebutuhan untuk menyimpan kumpulan nilai dari berbagai jenis. Elm memberi kita struktur data yang disebut tuple yang melayani tujuan ini.
Sebuah tupel merepresentasikan kumpulan nilai yang heterogen. Dengan kata lain, tupel memungkinkan penyimpanan banyak bidang dengan tipe berbeda. Tupel menyimpan sejumlah nilai tetap. Tupel berguna saat Anda ingin mengembalikan beberapa nilai dengan tipe berbeda dari suatu fungsi. Struktur data ini tidak dapat diubah seperti tipe lainnya di elm.
Sintaksis
(data1,data2)
Contoh sederhana ditunjukkan di bawah ini -
> ("TuotrialsPoint",5,True,"Hyderabad")
("TuotrialsPoint",5,True,"Hyderabad") : ( String, number, Bool, String )
Di bagian selanjutnya, kita akan belajar tentang operasi tupel yang berbeda.
pertama
Operasi ini mengekstrak nilai pertama dari sebuah tupel.
Sintaksis
Tuple.first tuple_name
> Tuple.first
<function> : ( a1, a2 ) -> a1
Ilustrasi
> Tuple.first (10,"hello")
10 : number
kedua
Itu second Operasi tupel mengekstrak nilai kedua dari sebuah tupel.
Sintaksis
Tuple.second tuple_name
> Tuple.second
<function> : ( a1, a2 ) -> a2
Ilustrasi
> Tuple.second (10,"hello")
"hello" : String
Daftar tupel
Daftar A dapat menyimpan Tupel. Jika tupel digunakan di dalam daftar, pastikan semuanya memiliki tipe data yang sama dan memiliki jumlah parameter yang sama.
Ilustrasi
> [("hello",20),("world",30)]
[("hello",20),("world",30)] : List ( String, number )
Tuple dengan fungsi
Suatu fungsi dapat mengembalikan tupel. Selain itu, tupel dapat dikirimkan sebagai parameter ke fungsi.
Ilustrasi 1
Contoh berikut mendefinisikan fungsi fn_checkEven. Fungsi ini menerima nilai integer sebagai parameter dan mengembalikan tupel.
> fn_checkEven no = \
if no%2 == 0 then \
(True,"The no is Even")\
else \
(False,"No is not even")
<function> : Int -> ( Bool, String )
> fn_checkEven 10
(True,"The no is Even") : ( Bool, String )
> fn_checkEven 11
(False,"No is not even") : ( Bool, String )
>
Ilustrasi 2
Berikut ini melewati tupel sebagai parameter ke suatu fungsi.
> fn_add (a,b) = \
| a+b
<function> : ( number, number ) -> number
> fn_add (10,20)
30 : number
Fungsi fn_add mengambil tupel dengan 2 nilai numerik dan mengembalikan jumlahnya.
Merusak
Destrukturisasi melibatkan pemecahan tupel menjadi nilai-nilai individu. Untuk mengakses nilai individu dalam tupel dengan tiga atau lebih elemen, kami menggunakan destructuring. Di sini, kami menetapkan setiap nilai dalam tupel ke variabel yang berbeda. Menggunakan _ one dapat menentukan placeholder untuk nilai yang akan diabaikan atau dilewati.
Ilustrasi
> (first,_,_) = (10,20,30)
10 : number
> first
10 : number
Ilustrasi
Dalam contoh ini, kami akan menggunakan sintaks blok let..in untuk merusak. Blok let berisi variabel dan blok dalam berisi ekspresi yang harus dievaluasi dan nilai yang harus dikembalikan.
> t1 = (10,20,30)
(10,20,30) : ( number, number1, number2 )
> let \
(a,b,c) = t1 \
in\
a + b +c
60 : number
Kami mendeklarasikan variabel abc dalam klausa let dan mengaksesnya menggunakan dalam klausa.
Struktur data record di Elm dapat digunakan untuk merepresentasikan data sebagai key-value pair. Rekaman dapat digunakan untuk mengatur data terkait untuk memungkinkan akses mudah dan memperbarui data. Catatan Elm mirip dengan objek di JavaScript. Elemen data dalam rekaman dikenal sebagai bidang.
Mendefinisikan Record
Gunakan sintaks berikut untuk mendefinisikan record -
Sintaksis
record_name = {fieldname1 = value1, fieldname2 = value2....fieldnameN = valueN}
Rekaman dapat menyimpan data dari berbagai jenis. Nama bidang dalam catatan harus sesuai dengan aturan umum untuk penamaan pengenal Elm.
Mengakses nilai record
Gunakan sintaks berikut untuk mengakses bidang individu dalam rekaman.
Sintaksis
record_name.fieldname
ATAU
.fieldname record_name
Ilustrasi
Coba yang berikut ini di Elm REPL -
> company = {name="TutorialsPoint",rating=4.5}
{ name = "TutorialsPoint", rating = 4.5 } : { name : String, rating : Float }
> company.name
"TutorialsPoint" : String
> .rating company
4.5 : Float
Menggunakan Rekam dengan Daftar
Rekaman dapat disimpan di dalam daftar. Semua nilai bidang dari rekaman harus berjenis sama.
Sintaksis
list_name = [ {field_name1 = value1},{field_name1 = value2}]
ATAU
list_name = [record_name1, record_name2, record_name3....record_nameN]
Ilustrasi
Coba yang berikut ini di Elm REPL -
> [{name = "Mohtashim"},{name = "kannan"}]
[{ name = "Mohtashim" },{ name = "kannan" }] : List { name : String }
> record1 = {name = "FirstRecord"}
{ name = "FirstRecord" } : { name : String }
> record2 = {name = "SecondRecord"}
{ name = "SecondRecord" } : { name : String }
> recordList = [record1,record2]
[{ name = "FirstRecord" },{ name = "SecondRecord" }] : List { name : String }
Perbarui Record
Rekor tidak dapat diubah di Elm. Saat rekaman diperbarui, rekaman baru dengan nilai yang diperbarui dikembalikan. Bidang dapat menyimpan nilai dari jenis yang berbeda saat memperbarui catatan.
Sintaksis
{record_name | field_name1 = new_value1, field_name2 = new_value2,field_name3 = new_value3....field_nameN = new_valueN}
Ilustrasi
Coba yang berikut ini di Elm REPL -
> record1 = {name="FirstRecord"}
{ name = "FirstRecord" } : { name : String }
> record1_updated = {record1 | name = "FirstRecordUpdate"}
{ name = "FirstRecordUpdate" } : { name : String }
> record1
{ name = "FirstRecord" } : { name : String }
> record1 == record1_updated
False : Bool
Ilustrasi
Contoh berikut memperbarui beberapa bidang catatan. Coba yang berikut ini di Elm REPL -
> record3 = {a = 1,b = 2,c = 3,d = 4,e = 5}
{ a = 1, b = 2, c = 3, d = 4, e = 5 }
: { a : number, b : number1, c : number2, d : number3, e : number4 }
> record4 = {record3 | d=400 ,e=500}
{ a = 1, b = 2, c = 3, d = 400, e = 500 }
: { a : number2, b : number3, c : number4, d : number, e : number1 }
>
Jenis alias
Alias tipe mendefinisikan skema untuk rekaman. Dengan kata lain, alias tipe menentukan bidang mana yang dapat menyimpan rekaman dan tipe nilai yang dapat disimpan bidang ini. Oleh karena itu, programmer tidak akan membuat kesalahan dengan kehilangan atribut tertentu saat memberikan nilai.
Sintaksis
type alias alias_name = {field_name1:data_type,field_name2:data_type,....field_nameN:data_type}
Ilustrasi
Jalankan yang berikut di Elm REPL -
> type alias Developer = { name:String,location:String,age:Int}
> dev1 = Developer "kannan" "Mumbai" 20
{ name = "kannan", location = "Mumbai", age = 20 } : Repl.Developer
> dev2 = Developer "mohtashim" "hyderabad" 20
{ name = "mohtashim", location = "hyderabad", age = 20 } : Repl.Developer
>
Sekarang jika Anda lupa mengetik lokasi dan usia, pernyataan tersebut mengembalikan fungsi, yang memiliki parameter masukan untuk bidang lokasi dan usia.
> dev3 = Developer "Bhagavati"
<function> : String -> Int -> Repl.Developer
We can invoke the function as shown below and pass to it the values for location and age fields.
> dev3 "Pune" 25
{ name = "Bhagavati", location = "Pune", age = 25 } : Repl.Developer
Kesalahan adalah kondisi yang tidak terduga dalam suatu program. Kesalahan dapat terjadi pada waktu kompilasi atau waktu proses. Kesalahan waktu kompilasi terjadi selama kompilasi program (Misalnya, kesalahan dalam sintaks program) sementara kesalahan runtime terjadi selama eksekusi program. Tidak seperti bahasa pemrograman lain, Elm tidak menampilkan error runtime.
Pertimbangkan aplikasi yang menerima usia pengguna. Aplikasi harus menampilkan kesalahan jika umur nol atau negatif. Dalam hal ini, aplikasi Elm dapat menggunakan konsep penanganan kesalahan untuk secara eksplisit meningkatkan kesalahan pada waktu proses jika pengguna memasukkan nol atau nilai negatif sebagai usia. Penanganan kesalahan menentukan tindakan jika sesuatu yang tidak terduga terjadi selama eksekusi program.
Bahasa pemrograman Elm menangani kesalahan dengan cara berikut -
- MayBe
- Result
Mungkin
Pertimbangkan fitur pencarian dalam sebuah aplikasi. Fungsi pencarian mengembalikan data terkait jika kata kunci pencarian ditemukan lain tidak mengembalikan apapun. Kasus penggunaan ini dapat diimplementasikan di Elm menggunakan tipe MayBe.
Sintaksis
variable_name:MayBe data_type
Variabel tipe MayBe dapat berisi salah satu dari nilai berikut -
Just some_Value - Ini digunakan jika ada data yang valid.
Tidak ada - Ini digunakan jika nilainya tidak ada atau tidak diketahui. Tidak ada yang setara dengan null dalam bahasa pemrograman lain.
Ilustrasi
Contoh berikut menunjukkan cara menggunakan tipe MayBe dengan variabel dan fungsi.
Step 1 - Buat MayBeDemo.elm file dan tambahkan kode berikut ke dalamnya
-- MayBeDemo.elm
module MayBeDemo exposing(..)
import Maybe
--declaring a MayBe variable and assigning value to it
userName : Maybe String
userName = Just "Mohtashim"
--declaring a MayBe variable and assigning value to it
userAge :Maybe Int
userAge = Just 20
--declaring a MayBe variable and assigning value to it
userSalary:Maybe Float
userSalary = Nothing
--declaring a custom type
type Country = India | China | SriLanka
--defining a function that takes a String parameter as input and returns a value of type MayBe
getCountryFromString : String -> Maybe Country
getCountryFromString p =
case p of
"India"
-> Just India
"China"
-> Just China
"SriLanka"
-> Just SriLanka
_
-> Nothing
Step 2 - Impor modul di repl elm dan jalankan seperti yang diberikan di bawah ini
E:\ElmWorks\ErroApp> elm repl
---- elm-repl 0.18.0 -----------------------------------------------------------
:help for help, :exit to exit, more at
-------------------------------------------------------------------------------- > import MayBeDemo exposing(..) > userName Just "Mohtashim" : Maybe.Maybe String > userAge Just 20 : Maybe.Maybe Int > userSalary Nothing : Maybe.Maybe Float > getCountryFromString "India" Just India : Maybe.Maybe MayBeDemo.Country > getCountryFromString "india" Nothing : Maybe.Maybe MayBeDemo.Country
Fungsi tersebut memeriksa apakah nilai yang diteruskan ke fungsi tersebut adalah India atau China atau SriLanka. Jika nilai parameter tidak cocok dengan semua ini, ia tidak mengembalikan apa-apa.
Hasil
Perhatikan contoh, di mana aplikasi perlu memvalidasi beberapa kondisi dan memunculkan kesalahan jika kondisi tidak terpenuhi. Jenis Hasil dapat digunakan untuk mencapai ini. Jenis Hasil harus digunakan jika aplikasi ingin secara eksplisit memunculkan kesalahan dan mengembalikan detail tentang apa yang salah.
Sintaksis
Deklarasi tipe Hasil mengambil dua parameter - tipe data dari kesalahan (biasanya String) dan tipe data dari hasil yang akan dikembalikan jika semuanya berjalan dengan baik.
type Result error_type data_value_type
= Ok data_value
| Err error_message
Jenis Hasil mengembalikan salah satu dari nilai berikut -
Ok some_value - Merupakan hasil yang akan dikembalikan
Err - Mewakili pesan kesalahan yang akan dikembalikan jika kondisi yang diharapkan tidak terpenuhi.
Ilustrasi 1
Coba contoh berikut di Elm REPL -
> String.toInt
<function> : String -> Result.Result String Int
-- successful result
> String.toInt "10"
Ok 10 : Result.Result String Int
-- unsuccessful result , Error
> String.toInt "a"
Err "could not convert string 'a' to an Int" : Result.Result String Int
Fungsi String.toInt mengembalikan nilai Integer jika parameter yang dikirimkan valid. Jika parameternya bukan angka, fungsi mengembalikan kesalahan.
Ilustrasi 2
Contoh berikut menerima usia sebagai parameter. Fungsi mengembalikan usia jika antara 0 dan 135 selain itu mengembalikan pesan kesalahan yang sesuai.
Step 1 - Buat file ResultDemo.elm dan tambahkan kode berikut ke dalamnya.
--ResultDemo.elm
module ResultDemo exposing(..)
userId : Result String Int
userId = Ok 10
emailId : Result String Int
emailId = Err "Not valid emailId"
isReasonableAge : String -> Result String Int
isReasonableAge input =
case String.toInt input of
Err r ->
Err "That is not a age!"
Ok age ->
if age < 0 then
Err "Please try again ,age can't be negative"
else if age > 135 then
Err "Please try agian,age can't be this big.."
else
Ok age
Step 2 - Impor modul dalam paket elm dan jalankan seperti yang diberikan di bawah ini
E:\ElmWorks\ElmRepo\15_ErrorHandling\15_Code> elm repl
---- elm-repl 0.18.0 -----------------------------------------------------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
--------------------------------------------------------------------------------
> import ResultDemo exposing (..)
> userId
Ok 10 : Result.Result String Int
> emailId
Err "Not valid emailId" : Result.Result String Int
> isReasonableAge "10"
Ok 10 : Result.Result String Int
> isReasonableAge "abc"
Err "That is not a age!" : Result.Result String Int
Pada bab ini, kita akan membahas cara standar membuat aplikasi pada platform Elm. Elm menggunakan pola arsitektur yang mirip dengan pola Model-View-Controller.
Berikut adalah empat bagian utama Arsitektur Elm.
- Model
- View
- Message
- Update
Bagaimana cara kerja arsitektur Elm
Itu modelberisi status aplikasi. Misalnya, jika suatu aplikasi menampilkan daftar pelanggan maka negara akan memuat setiap data pelanggan. Untuk menampilkan keadaan dengan cara yang rapi, aview/ html harus dibuat. Setelah pengguna berinteraksi dengan tampilan dengan menekan tombol atau mengetik data dalam formulir, tampilan menghasilkan sinyal yang disebutmessages. Pesan diteruskan keupdatemetode, yang mengevaluasi pesan dan mengambil tindakan yang tepat. Oleh karena itu, metode pembaruan akan menghasilkan model baru.
Model baru menghasilkan tampilan baru. Tampilan akan mengarah pada interaksi baru dari pengguna ke pesan sinyal, yang menuju ke fungsi pembaruan. Selanjutnya, fungsi tersebut membuat model baru. Jadi, siklus berulang seperti yang ditunjukkan pada diagram di atas.
Model
Model berhubungan dengan status aplikasi. Sintaks untuk mendefinisikan Model diberikan di bawah ini -
-- Model syntax
type alias Model = {
property1:datatype,
proptery2:datatype
...
}
Untuk membuat model, pertama-tama kita harus membuat template dengan semua properti yang diperlukan di dalamnya. Setiap properti menentukan status aplikasi.
Melihat
Tampilan adalah representasi visual dari status aplikasi. View tahu bagaimana mengambil data dan menghasilkan halaman web darinya. Saat pengguna berinteraksi dengan View, pengguna dapat memanipulasi status dengan membuat pesan. Sintaks untuk mendefinisikan View diberikan di bawah ini -
--View Syntax
view model =some_implementation
Pesan
Pesan adalah permintaan dari pengguna untuk mengubah status aplikasi. Pesan diteruskan sebagai parameter ke fungsi pembaruan.
--Message Syntax
type Message = Message1 |Message2 ...
Sintaks menunjukkan jenis Pesan. Aplikasi elm akan mengedit status berdasarkan pesan yang diteruskan kepadanya. Keputusan ini dibuat dalam metode pembaruan.
Memperbarui
Fungsi update menafsirkan pesan, yang diteruskan sebagai parameter untuk itu, dan mengupdate model.
--Update Syntax
update Message_type model =
some_implementation
Fungsi pembaruan membutuhkan Message dan Model sebagai parameter.
Manajer paket adalah alat baris perintah yang mengotomatiskan proses penginstalan, peningkatan, konfigurasi, dan penghapusan paket di aplikasi Anda.
Sama seperti JavaScript memiliki manajer paket yang disebut npm, elm memiliki manajer paket yang disebut elm-package .
Manajer paket melakukan tiga tugas berikut -
- Menginstal semua dependensi yang dibutuhkan aplikasi elm
- Menerbitkan paket khusus
- Menentukan versi paket Anda saat Anda siap untuk menerbitkan dan memperbarui.
Perintah Elm Package Manager
Tabel berikut mencantumkan berbagai perintah manajer paket Elm -
No Sr | Perintah | Sintaksis | Deskripsi |
---|---|---|---|
1 | Install | elm-paket instal | Instal paket untuk digunakan secara lokal |
2 | menerbitkan | elm-package publish | Publikasikan paket Anda ke katalog pusat |
3 | menabrak | benjolan paket elm | Menumpukkan nomor versi berdasarkan perubahan API |
4 | beda | elm-paket diff | Mendapat perbedaan antara dua API |
Untuk memublikasikan paket Anda, Anda perlu menghosting kode sumber di GitHub dan memiliki versi yang diberi label dengan benar dengan tag git. Ilustrasi berikut menunjukkan bagaimana menggunakan manajer paket-elm untuk menarik ketergantungan eksternal.
Ilustrasi - Menginstal paket svg
Dalam contoh ini, kita akan melihat bagaimana mengintegrasikan Scalable Vector Graphics (SVG) ke dalam aplikasi elm.
Step 1 - Buat folder elmSvgApp
Step 2 - Instal paket svg menggunakan perintah berikut -
elm-package install elm-lang/svg
Step 3- Instal Buat file SvgDemo.elm dan ketik konten yang diberikan di bawah ini. Kami mengimpor modul Svg untuk menggambar persegi panjang dengan dimensi 100x100 dan mengisi warna merah.
import Svg exposing (..)
import Svg.Attributes exposing (..)
main =
svg
[ width "120"
, height "120"
, viewBox "0 0 120 120"
]
[ rect
[ x "10"
, y "10"
, width "100"
, height "100"
, rx "15"
, ry "15"
,fill "red"
]
[]
]
Step 4- Sekarang buat proyek menggunakan elm make. \ SvgDemo.elm. Ini akan menghasilkan index.html seperti yang ditunjukkan di bawah ini -
Pesan adalah komponen dalam arsitektur Elm. Komponen ini dibuat oleh View sebagai tanggapan atas interaksi pengguna dengan antarmuka aplikasi. Pesan mewakili permintaan pengguna untuk mengubah status aplikasi.
Sintaksis
--Message Syntax
type Message = some_message1 |some_message2 ...|some_messageN
ilustrasi
Contoh berikut adalah aplikasi penghitung sederhana. Aplikasi menambah dan mengurangi nilai variabel sebesar 1 saat pengguna mengklik masing-masing tombol Tambah dan Kurangi.
Aplikasi ini akan memiliki 4 komponen. Komponennya dijelaskan di bawah -
Pesan
Pesan untuk contoh ini adalah -
type Message = Add | Subtract
Model
Model merepresentasikan status aplikasi. Dalam aplikasi counter definisi model diberikan di bawah ini; keadaan awal penghitung akan menjadi nol.
model = 0
Melihat
Tampilan mewakili elemen visual dari aplikasi. Tampilan berisi dua tombol (+) dan (-). Pesan Tambah dan Kurangi dihasilkan oleh Tampilan saat pengguna masing-masing mengklik tombol + dan -. Nilai modifikasi dari model kemudian ditampilkan oleh View.
view model =
-- invoke text function
h1[]
[ div[] [text "CounterApp from TutorialsPoint" ]
,button[onClick Subtract] [text "-"]
,div[][text (toString model)]
,button[onClick Add] [text "+"]
]
Memperbarui
Komponen ini berisi kode yang harus dijalankan untuk setiap pesan yang dihasilkan oleh tampilan. Ini ditunjukkan pada contoh di bawah -
update msg model =
case msg of
Add -> model+1
Subtract -> model-1
Menyatukan semuanya
Step 1- Buat folder MessagesApp dan file MessagesDemo.elm
Step 2 - Tambahkan kode berikut di file elm -
import Html exposing (..)
import Html.Events exposing(onClick)
model = 0 -- Defining the Model
--Defining the View
view model =
h1[]
[ div[] [text "CounterApp from TutorialsPoint" ]
,button[onClick Subtract] [text "-"]
,div[][text (toString model)]
,button[onClick Add] [text "+"]
]
--Defining the Messages
type Message = Add | Subtract
--Defining Update
update msg model =
case msg of
Add -> model+1
Subtract -> model-1
-- Define the main method
main =
beginnerProgram
{
model=model
,view=view
,update=update
}
Step 3 - Jalankan elm make commanddi terminal. Ituelm make command mengkompilasi kode dan menghasilkan file HTML dari file .elm yang dibuat di atas.
C:\Users\dell\elm\MessagesApp> elm make .\MessageDemo.elm
Some new packages are needed. Here is the upgrade plan.
Install:
elm-lang/core 5.1.1
elm-lang/html 2.0.0
elm-lang/virtual-dom 2.0.4
Do you approve of this plan? [Y/n] y
Starting downloads...
ΓùÅ elm-lang/html 2.0.0
ΓùÅ elm-lang/virtual-dom 2.0.4
ΓùÅ elm-lang/core 5.1.1
Packages configured successfully!
Success! Compiled 38 modules.
Successfully generated index.html
Step 4 - Buka index.html dan verifikasi kerja seperti yang ditunjukkan di bawah ini -
Elm - Perintah
Pada bab-bab sebelumnya kita telah membahas berbagai komponen arsitektur Elm dan fungsinya. Pengguna dan aplikasi berkomunikasi satu sama lain menggunakan Message.
Pertimbangkan contoh, di mana aplikasi perlu berkomunikasi dengan komponen lain seperti server eksternal, API, layanan mikro, dll. Untuk melayani permintaan pengguna. Ini dapat dicapai dengan menggunakan Perintah di Elm. Pesan dan perintah tidak sama. Pesan mewakili komunikasi antara pengguna akhir dan aplikasi sementara perintah mewakili bagaimana aplikasi Elm berkomunikasi dengan entitas lain. Perintah dipicu sebagai tanggapan atas pesan.
Gambar berikut menunjukkan alur kerja aplikasi Elm yang kompleks -
Pengguna berinteraksi dengan tampilan. Tampilan menghasilkan pesan yang sesuai berdasarkan tindakan pengguna. Komponen pembaruan menerima pesan ini dan memicu perintah.
Sintaksis
Sintaks untuk mendefinisikan perintah seperti yang diberikan di bawah ini -
type Cmd msg
Pesan yang dihasilkan oleh view tersebut diteruskan ke perintah.
Ilustrasi
Contoh berikut membuat permintaan ke API dan menampilkan hasil dari API.
Aplikasi menerima nomor dari pengguna, meneruskannya ke Numbers API. API ini mengembalikan fakta terkait nomor tersebut.
Berbagai komponen aplikasi adalah sebagai berikut -
Modul Http
Modul Http Elm digunakan untuk membuat dan mengirim permintaan HTTP. Modul ini bukan merupakan bagian dari modul inti. Kami akan menggunakan manajer paket elm untuk menginstal paket ini.
API
Dalam contoh ini, aplikasi akan berkomunikasi dengan Numbers API - "http://numbersapi.com/#42".
Melihat
Tampilan aplikasi berisi kotak teks dan tombol.
view : Model -> Html Msg
view model =
div []
[ h2 [] [text model.heading]
,input [onInput Input, value model.input] []
, button [ onClick ShowFacts ] [ text "show facts" ]
, br [] []
, h3 [][text model.factText]
]
Model
Model mewakili nilai yang dimasukkan oleh pengguna dan hasil yang akan dikembalikan oleh API.
type alias Model =
{ heading : String
, factText : String
, input :String
}
Pesan
Aplikasi ini memiliki tiga pesan berikut -
- ShowFacts
- Input
- NewFactArrived
Setelah mengklik tombol Show Facts , pesan ShowFacts diteruskan ke metode update. Ketika pengguna mengetik beberapa nilai di kotak teks, pesan Input diteruskan ke metode pembaruan. Akhirnya, ketika respons server Http diterima, pesan NewFactArrived akan diteruskan ke pembaruan.
type Msg
= ShowFacts
|Input String
| NewFactArrived (Result Http.Error String)
Memperbarui
Metode update mengembalikan tupel, yang berisi objek model dan perintah. Ketika pengguna mengklik tombol Tampilkan Fakta, Pesan diteruskan ke pembaruan yang kemudian memanggil NumbersAPI.
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Input newInput ->
(Model "NumbersApi typing.." "" newInput ,Cmd.none)
ShowFacts ->
(model, getRadmonNumberFromAPI model.input)
NewFactArrived (Ok newFact) ->
(Model "DataArrived" newFact "", Cmd.none)
NewFactArrived (Err _) ->
(model, Cmd.none)
Fungsi Pembantu
Fungsi pembantu getRandomNumberFromAPI memanggil NumbersAPI dan meneruskan nomor yang dimasukkan pengguna. Hasil yang dikembalikan oleh API digunakan untuk memperbarui model.
getRadmonNumberFromAPI : String->Cmd Msg
getRadmonNumberFromAPI newNo =
let
url =
"http://numbersapi.com/"++newNo
in
Http.send NewFactArrived (Http.getString url)
No Sr | metode | Tanda tangan | Deskripsi |
---|---|---|---|
1 | Http.getString | getString: String -> Permintaan String | Buat permintaan GET dan tafsirkan isi respons sebagai String. |
2 | Http.send | kirim: (Kesalahan Hasil a -> pesan) -> Minta a -> Pesan Cmd | Kirim permintaan Http. |
utama
Ini adalah pintu masuk proyek Elm.
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
Menyatukan semuanya
Step 1 - Buat folder CommandApp dan file CommandDemo.elm.
Step 2- Instal modul http menggunakan perintah paket elm install elm-lang / http .
Step 2 - Ketik konten untuk CommandDemo.elm seperti yang ditunjukkan di bawah ini -
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Http
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
-- MODEL
type alias Model =
{ heading : String
, factText : String
, input :String
}
init : (Model, Cmd Msg)
init =
( Model "NumbersAPI" "NoFacts" "42"-- set model two fields
, Cmd.none -- not to invoke api initially
)
-- UPDATE
type Msg
= ShowFacts
|Input String
| NewFactArrived (Result Http.Error String)
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Input newInput ->
(Model "NumbersApi typing.." "" newInput ,Cmd.none)
ShowFacts ->
(model, getRadmonNumberFromAPI model.input)
NewFactArrived (Ok newFact) ->
(Model "DataArrived" newFact "", Cmd.none)
NewFactArrived (Err _) ->
(model, Cmd.none)
- VIEW
view : Model -> Html Msg
view model =
div []
[ h2 [] [text model.heading]
,input [onInput Input, value model.input] []
, button [ onClick ShowFacts ] [ text "show facts" ]
, br [] []
, h3 [][text model.factText]
]
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
-- HTTP
getRadmonNumberFromAPI : String->Cmd Msg
getRadmonNumberFromAPI newNo =
let
url =
"http://numbersapi.com/"++newNo
in
Http.send NewFactArrived (Http.getString url)
Step 4 - Tembak perintahnya.
C:\Users\dell\elm\CommandApp> elm make .\CommandDemo.elm
Ini akan menghasilkan file html seperti yang ditunjukkan di bawah ini.
Elm - Langganan
Pada bab sebelumnya, kita telah membahas bahwa View berinteraksi dengan komponen lain menggunakan Perintah. Demikian pula, komponen (Misalnya WebSocket) dapat berbicara ke View menggunakan Subscriptions. Langganan adalah cara aplikasi Elm dapat menerima input eksternal seperti acara keyboard, acara pengatur waktu, dan acara WebSocket.
Gambar berikut menjelaskan peran Langganan dalam aplikasi Elm. Pengguna berinteraksi dengan aplikasi Elm melalui pesan. Aplikasi yang diberikan menggunakan WebSocket dan memiliki dua mode operasi -
- Kirim data sisi klien ke server soket melalui Command
- Terima data kapan saja dari server soket melalui Berlangganan
Sintaksis
Sintaks untuk menentukan langganan diberikan di bawah ini -
type Sub msg
Ilustrasi
Mari kita pahami langganan menggunakan contoh sederhana.
Dalam contoh yang diberikan di bawah ini, aplikasi mengirimkan pesan ke server. Server adalah server gema, yang menanggapi klien dengan pesan yang sama. Semua pesan masuk kemudian ditampilkan dalam daftar. Kami akan menggunakan WebSocket (protokol wss) untuk dapat terus mendengarkan pesan dari server. WebSocket akan mengirimkan input pengguna ke server menggunakan Perintah sementara itu akan menggunakan Langganan untuk menerima pesan dari server.
Berbagai komponen aplikasi diberikan di bawah ini -
Server gema
Server echo dapat diakses menggunakan protokol wss. Server gema mengirimkan kembali masukan pengguna ke aplikasi. Kode untuk mendefinisikan server gema diberikan di bawah ini -
echoServer : String
echoServer =
"wss://echo.websocket.org"
Model
Model mewakili input pengguna dan daftar pesan masuk dari server soket. Kode untuk mendefinisikan Model adalah seperti yang diberikan di bawah ini -
type alias Model =
{ input : String
, messages : List String
}
Pesan
Jenis pesan akan berisi Input untuk mengambil input teks dari pengguna. Pesan Kirim akan dibuat ketika pengguna mengklik tombol untuk mengirim pesan ke server WebSocket. NewMessage digunakan ketika pesan datang dari server echo.
type Msg
= Input String
| Send
| NewMessage String
Melihat
Tampilan aplikasi berisi kotak teks dan tombol kirim untuk mengirim masukan pengguna ke server. Respon dari server ditampilkan di View menggunakan tag div .
view : Model -> Html Msg
view model =
div []
[ input [onInput Input, value model.input] []
, button [onClick Send] [text "Send"]
, div [] (List.map viewMessage (List.reverse model.messages))
]
viewMessage : String -> Html msg
viewMessage msg =
div [] [ text msg ]
Memperbarui
Fungsi update mengambil pesan dan komponen model. Ini memperbarui model berdasarkan jenis pesan.
update : Msg -> Model -> (Model, Cmd Msg)
update msg {input, messages} =
case msg of
Input newInput ->
(Model newInput messages, Cmd.none)
Send ->
(Model "" messages, WebSocket.send echoServer input)
NewMessage str ->
(Model input (str :: messages), Cmd.none)
No Sr | metode | Tanda tangan | Deskripsi |
---|---|---|---|
1 | WebSocket.listen | dengarkan: String -> (String -> msg) -> Sub msg | Berlangganan untuk mendapatkan pesan masuk di websocket. |
2 | WebSocket.send | kirim: String -> String -> Cmd msg | Mengirim permintaan wss ke alamat server. Penting bahwa Anda juga berlangganan alamat ini dengan mendengarkan. Jika tidak, web socket akan dibuat untuk mengirim satu pesan dan kemudian ditutup. |
Berlangganan
Fungsi langganan mengambil objek model. Untuk menerima pesan dari server WebSocket, kami memanggil WebSocket.listen yang meneruskan pesan sebagai NewMessage . Ketika pesan baru datang dari server, metode pembaruan dipanggil.
subscriptions : Model -> Sub Msg
subscriptions model =
WebSocket.listen echoServer NewMessage
main
The main function is the entry point to the elm application as shown below.
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
Putting it all together
Step 1 − Create a directory,SubscriptionApp and add a file,SubscriptionDemo.elm to it.
Step 2 − Add the following contents to SubscriptionDemo.elm file −
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import WebSocket
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
echoServer : String
echoServer =
"wss://echo.websocket.org"
-- MODEL
type alias Model =
{ input : String
, messages : List String
}
init : (Model, Cmd Msg)
init =
(Model "" [], Cmd.none)
-- UPDATE
type Msg
= Input String
| Send
| NewMessage String
update : Msg -> Model -> (Model, Cmd Msg)
update msg {input, messages} =
case msg of
Input newInput ->
(Model newInput messages, Cmd.none)
Send ->
(Model "" messages, WebSocket.send echoServer input)
NewMessage str ->
(Model input (str :: messages), Cmd.none)
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
WebSocket.listen echoServer NewMessage
-- VIEW
view : Model -> Html Msg
view model =
div []
[ input [onInput Input, value model.input] []
, button [onClick Send] [text "Send"]
, div [] (List.map viewMessage (List.reverse model.messages))
]
viewMessage : String -> Html msg
viewMessage msg =
div [] [ text msg ]
Step 3 − Install the websockets package using elm package manager.
C:\Users\dell\elm\SubscriptionApp> elm-package install elm-lang/websocket
Step 4 − Build and generate index.html file as shown below.
C:\Users\dell\elm\SubscriptionApp> elm make .\SubscriptionDemo.elm
Step 5 − Upon execution, the following output will be generated −