Kami menulis "Halo, dunia!" Aplikasi web Haskell (Spock)

Saya bosan menulis dengan Python, saya menginginkan sesuatu yang tidak biasa. Saya memutuskan untuk mencoba Haskell. Saya tidak tahu bahasa, tetapi saya tidak ingin menulis program pelatihan konsol, seperti menghitung faktorial. Setelah mempelajari sejumlah besar posting tentang Haskell dan penerapannya dalam kehidupan nyata, saya menyadari bahwa salah satu poin potensial dari pertumbuhan popularitas bahasa adalah menulis aplikasi web. Anehnya, ada beberapa kerangka kerja web di bawah Haskell. Pilihan saya jatuh pada Spock , karena, dilihat dari deskripsi, itu adalah kerangka kerja yang sederhana dan cepat untuk dikembangkan. Saya memiliki beberapa pengalaman menulis aplikasi web di Flask, jadi saya pikir akan menarik untuk membandingkan pendekatan berbeda untuk memecahkan masalah yang sama. Dalam artikel ini, saya akan mencoba memberikan cara saya coba-coba yang paling terperinci dalam studi Haskell menggunakan contoh penulisan aplikasi web Spock paling sederhana. Mungkin ini akan berguna bagi mereka yang ragu apakah akan mencoba mempelajari Haskell dan apakah itu akan berguna dalam kehidupan nyata.


Sedikit tentang Haskell dan cara memasaknya


Hal pertama yang dihadapi setiap pengembang saat mempelajari bahasa baru adalah memilih dan mengatur lingkungan pengembangan. Tentu saja, Anda dapat menulis di buku catatan, tetapi jika Anda memiliki setidaknya beberapa pengalaman dalam mengembangkan proyek produksi, metode ini akan membuat Anda kesal. Ngomong-ngomong, Haskell cukup tua dan bahasa umum dan memiliki dukungan untuk editor dan ide paling terkenal. Teman saya Haskellist menggunakan emacs. Saya sudah terbiasa dengan IDE normal, jadi saya menginstal plugin untuk IntelliJ.


Juga, untuk pengembangan, Anda perlu tumpukan , yang sekarang menjadi standar dan menggabungkan kompiler, sistem manajemen paket, sistem pembangunan dan pengujian.


Semuanya terlihat cukup ramah, tidak ada masalah dengan instalasi. Untuk pengembangan, saya menggunakan Mac OS, saya belum mengujinya pada sistem lain, tapi saya curiga bahwa di Linux semuanya akan mulai tanpa masalah juga.


Halo dunia!


Persiapan


Kami pergi ke tutorial dan mencoba melakukan semuanya sesuai dengan instruksi. Di sana mereka menyarankan terlebih dahulu membuat proyek standar melalui stack: stack new MyLovelyProlect . Proyek standar adalah folder dengan tiga subfolder: app , src , test . Ini terlihat cukup logis: satu folder untuk aplikasi utama, satu untuk fungsi tambahan, yang ketiga untuk pengujian. Karena kami menulis "Halo, dunia!", Kami tidak memerlukan src dan folder test , tetapi kami tidak perlu menghapusnya, karena jika tidak kami harus membersihkan file lain dengan hati-hati, misalnya, HelloWorld.cabal .


Sebenarnya kodenya


Selanjutnya dalam tutorial ini diusulkan untuk menyalin beberapa kode ke Main.hs Kami akan menyederhanakannya sedikit lebih untuk membandingkan dengan apa yang ditawarkan flask.


 {-# LANGUAGE OverloadedStrings #-} module Main where import Web.Spock import Web.Spock.Config app :: SpockM () () () () app = get root $ text "Hello World!" main :: IO () main = do cfg <- defaultSpockCfg () PCNoDatabase () let mw = spock cfg app runSpock 8080 mw 

Sebagai perbandingan, saya akan memberikan kode yang sama dalam labu:


 from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" app.run() 

Dengan jumlah baris, labu masih menang: 8 berbanding 13. Tetapi mengingat Haskell adalah bahasa yang diketik secara statis dan 2 baris menempati penentuan jenis, perbedaannya, menurut saya, kecil. Setidaknya kode di atas tidak membuat saya takut belajar lebih lanjut bahasa.


Perakitan dan peluncuran


Selanjutnya, pergi ke HelloWorld.cabal dan tambahkan executable HelloWorld-exe ke bagian build-depends: line Spock >=0.13 . Dalam tutorial di situs ini, diusulkan untuk menyertakan 2 dependensi lagi, tetapi untuk tujuan saya mereka belum diperlukan. Jika sekarang kita mencoba membangun aplikasi menggunakan stack build --fast --pedantic , kita mendapatkan kesalahan berikut:


 Error: While constructing the build plan, the following exceptions were encountered: In the dependencies for HelloWorld-0.1.0.0: Spock must match >=0.13, but the stack configuration has no specified version (latest matching version is 0.13.0.0) needed since HelloWorld is a build target. Some different approaches to resolving this: * Consider trying 'stack solver', which uses the cabal-install solver to attempt to find some working build configuration. This can be convenient when dealing with many complicated constraint errors, but results may be unpredictable. * Recommended action: try adding the following to your extra-deps in /Users/dkvasov/Documents/Haskell/Spock/HelloWorld/stack.yaml: Spock-0.13.0.0@sha256:8115862eb4fb84a26fb7bcd34f30acf036bd2e7c4eaf813c185c5562d138bba2 Plan construction failed. 

Cukup jelas: stack tidak tahu versi Spock mana yang perlu diinstal, jadi itu perlu ditulis dalam file stack.yaml . Tambahkan extra-deps dan coba untuk membangun lagi. Ada beberapa kesalahan serupa lainnya akan muncul, dan sebagai hasilnya, di file stack.yaml , saya mendapatkan yang berikut:


 extra-deps: - Spock-0.13.0.0 - Spock-core-0.13.0.0 - reroute-0.5.0.0 - stm-containers-0.2.16 - focus-0.1.5.2 

Setelah itu, semuanya berkumpul. Artefak koleksi saya ada di .stack-work/dist/x86_64-osx/Cabal-2.4.0.1/build .


Semuanya dimulai dengan perintah stack exec HelloWorld-exe , dan di localhost:8080 saya melihat sambutan "Hello, world!". Tidak perlu menari dengan rebana.


Kami mencoba mencari tahu apa yang sedang terjadi.


Sejauh ini, kami belum menggunakan pengetahuan khusus tentang pemrograman fungsional (FP) dan bahasa Haskell. Kami menggunakan akal sehat dan pengetahuan tentang dasar-dasar pembangunan. Anda tidak bisa melakukan itu lebih jauh. Untuk pemahaman lebih lanjut, kita perlu mengetahui beberapa hal tentang AF. AF bukan antipode OOP. Mereka yang akrab dengan bahasa Scala tahu bahwa kedua konsep ini hidup berdampingan dengan mudah. Antipode FP adalah pemrograman imperatif. Sementara model fungsional perhitungan bergantung pada komposisi fungsi, model imperatif bergantung pada proses perubahan berturut-turut di negara bagian sistem. Oleh karena itu, dalam bahasa yang murni fungsional seperti Haskell, diasumsikan bahwa fungsinya "murni", yaitu, mereka tidak mengandung keadaan yang dapat berubah dan "efek samping", selain nilai pengembalian. Ini membuatnya mudah untuk membangun komposisi fitur. Sebenarnya, persyaratan "kemurnian" memberlakukan banyak pembatasan pada penggunaan bahasa fungsional di dunia nyata. Namun, karena ada aplikasi produksi di Haskell, maka Anda masih dapat menggunakan fungsi murni di dunia nyata. Mari kita lihat lebih dekat Main.hs


Seperti yang saya mengerti, aplikasi app adalah variabel dari tipe SpockM , yang merupakan monad . Kemungkinan besar, jika Anda tidak terbiasa dengan gaya fungsional pemrograman dan teori kategori, Anda tidak akan mengerti pertama kali apa itu dan mengapa Anda membutuhkannya. Namun, perlu untuk menangani ini setidaknya pada tingkat dasar, karena monad adalah dasar untuk penerapan bahasa Haskell. Ada beberapa artikel dengan berbagai tingkat detail mengenai hal ini, termasuk tentang Habrรฉ. Tentu saja, saya tidak akan membawa mereka ke sini. Sejauh ini, saya mengusulkan untuk mempertimbangkan bahwa monad adalah sihir yang memungkinkan Anda menghasilkan apa yang disebut efek samping. Ada monad lain dalam aplikasi kita: IO . Efek sampingnya adalah input / output data.


SpockM diparameterisasi oleh empat tipe lainnya. Mereka sesuai dengan koneksi basis data, sesi, negara, dan nilai kembali. Untuk aplikasi kosong, semua ini tidak diperlukan, jadi kami akan selalu menggunakan type () , yang disebut Unit. Di dalam app kami mengikat jalur ke tindakan. Dalam hal ini, kami menentukan jalur dasar / dan tindakan "Hello, world! get- .


Selanjutnya, kita membuat konfigurasi default dan menetapkannya ke cfg . Selanjutnya, menggunakan fungsi spock buat middleware untuk aplikasi dan cfg dan transfer ke runSpock bersama dengan port peluncuran yang diinginkan.


Kesimpulan


Jelas bahwa semua yang dijelaskan di sini sangat sederhana, dan setiap orang yang berbicara bahasa Inggris dan dilengkapi dengan otak akan dapat melakukan hal yang sama dengan melihat tutorial awal spock. Artikel ini lebih tentang bagaimana saya berkenalan dengan bahasa Haskell. Apa selanjutnya Lebih lanjut, hampir semua sumber belajar menyarankan untuk menggunakan status dan menulis aplikasi todo, lalu menghubungkan database, lalu ... Mungkin di masa depan saya akan menulis sekuel.


Referensi


Source: https://habr.com/ru/post/id449628/


All Articles