Teks ini adalah terjemahan gratis dari serangkaian artikel Sacha Barber dari Brighton, UK yang menurut saya cukup menarik.Ini adalah posting pertama dalam seri F # saya. Jadi apa yang akan kita bahas? Seperti yang diketahui oleh banyak programmer, adalah kebiasaan untuk memulai dengan contoh Hello World.
Jadi kami akan melakukan hal itu. Jadi, tanpa basa-basi, apa yang Anda butuhkan untuk membuat aplikasi terpisah "Hello World" di F #.
Ini dia:
open System [<EntryPoint>] let main argv = printfn "Hello World" Console.ReadLine() |> ignore 0
// Sayangnya, saya tidak dapat menemukan alokasi kode untuk F #Ini mungkin tampaknya tidak cukup untuk dibahas, tetapi sudah ada sesuatu yang perlu dipertimbangkan untuk membenamkan diri dalam beberapa prinsip F #.
Jadi apa sebenarnya yang terjadi di sini?
Karena ini adalah aplikasi yang terpisah, kami jelas membutuhkan titik masuk (seperti untuk bahasa .NET lainnya).
Jadi bagaimana titik masuk ditentukan?
Yah, hampir sama dengan bahasa .NET lainnya, kami memiliki metode Utama (atau fungsi dalam terminologi F #) yang menggunakan array string, dan kami menggunakan atribut [] untuk menunjukkan bahwa metode dengan atribut ini adalah titik masuk.
Kompiler dan Visual Studio menyukai kami untuk ini.
Bahkan dalam contoh ini, Anda harus mendengar lonceng alarm atau setidaknya beberapa kesalahpahaman. Jadi, kami mengatakan bahwa ada fungsi awal yang mengambil larik tipe string. Yang saya lihat adalah variabel bernama "argv", yang saya tidak lihat dideklarasikan sebagai array. Variabel "argv" ini jelas merupakan array string yang kita harapkan, tetapi mengapa tidak memiliki tipe .... Mmm, menarik.
F # memiliki sistem inferensi tipe yang sangat baik, yang berarti bahwa dalam banyak kasus Anda dapat menghilangkan tipe sama sekali, dan F # akan mengeluarkannya dengan benar. Tentu saja, Anda masih dapat sepenuhnya mendeklarasikan jenis variabel input jika Anda mau, di mana biasanya mengambil formulir
(variableName: variableType)Oleh karena itu, dengan mengambil contoh "argv" di atas, kita dapat mendeklarasikan program di atas sebagai berikut, dan itu akan menyenangkan:
open System [<EntryPoint>] let main (argv :string[]) = printfn "Hello World" Console.ReadLine() |> ignore 0
Anda lihat, kami telah sepenuhnya mendefinisikan nama variabel input dengan tipenya, yang dalam hal ini adalah array dari string [].
Apa lagi yang menarik di sana? Yah, seperti yang saya katakan, ada sesuatu untuk dibicarakan.
Mengapa saya memiliki garis dengan
abaikan yang aneh ini pada akhirnya. Apa ini
Yah, karena ini adalah aplikasi konsol F #, saya ingin aplikasi tidak dimatikan sampai pengguna memasukkan karakter. Jadi saya perlu melakukan 2 hal:
- Buka namespace "Sistem", yang memungkinkan saya untuk menggunakan tipe namespace "Sistem", seperti saya menggunakan "using System" di C # atau "Imports System" di VB .NET. "
- Karena F # adalah bahasa fungsional, itu akan mengeluh jika fungsi, dalam hal ini "Konsol.ReadLine (...)", yang dapat mengembalikan string, tidak meneruskan hasilnya lebih jauh ke fungsi "abaikan", yang sebenarnya berarti kembali () (ini caranya) di F # katakanlah batal, tapi itu disebut Unit). Ini secara eksplisit memberitahu F # untuk mengabaikan hasil memanggil metode Console.ReadLine (..).
Sebagai contoh, di sini akan terlihat seperti apa kode jika saya memutuskan untuk tidak memasukkan |> abaikan

Programmer C # / VB.NET mungkin tidak melihat apa yang dikatakan di sini. Tetapi F # cukup sulit pada apa fungsi bisa dan tidak bisa dilakukan. Dan satu hal yang fungsi HARUS SELALU lakukan adalah mengembalikan hasilnya. Dalam kasus fungsi "utama", hasil yang diharapkan akan menjadi nilai integer 0.
Tapi bagaimana dengan kasus Console.ReadLine (..)?
Yah, setidaknya dalam hal ini hasilnya tidak terlalu menjadi masalah, dan kami tidak tertarik, dan program akan tetap berfungsi jika kita lewati
|> abaikan , tetapi jika Anda benar-benar tidak tertarik dengan hasilnya, Anda harus belajar menggunakan
|> abaikan . Jika Anda tertarik, operator pipa "|>" akan mengarahkan nilai balik ekspresi kiri ke fungsi yang benar, yang dalam hal ini sama dengan
"menerima nilai pengembalian Konsol.Readline (...) dan mengabaikan bagaimana tidak ada yang peduli tentang hal itu .
" Jangan khawatir jika ini tidak berarti apa-apa bagi Anda pada tahap ini, kami akan membicarakan lebih lanjut tentang ini nanti.
Hal terakhir yang perlu saya lakukan adalah memastikan bahwa fungsi F # selalu mengembalikan nilai, ini dilakukan di baris di mana Anda hanya melihat baris 0. Ini cukup untuk F # untuk memahami bahwa ini adalah nilai pengembalian "0", yang merupakan sistem inferensi tipe akan menampilkan, ini adalah nilai Int 0. Alasan mengapa kompiler F # tahu bahwa ini adalah nilai balik adalah karena dalam kasus ini ini adalah pernyataan terakhir, sehingga HARUS menjadi nilai balik. Jelas, ini bisa rumit dengan menggunakan logika kondisional jika, yang lain, dll. Penting untuk dicatat bahwa dalam F # fungsi HARUS SELALU mengembalikan nilai, dan dalam hal ini, karena nilai 0 Int adalah string terakhir yang ditemukan (walaupun semuanya bisa lebih rumit), ini digunakan sebagai nilai pengembalian. Tentu saja, Anda dapat mengembalikan Unit, yang dilakukan dengan menggunakan "()", yang sebenarnya tidak mengembalikan apa pun (batal jika Anda mau).
Hal lain yang ingin saya sebutkan dalam contoh sepele ini adalah bahwa spasi putih memainkan peran kunci dalam pengembangan F #.
Misalnya, anggap contoh sepele saya terlihat seperti ini di editor (dalam kasus saya, Visual Studio 2012):

Ini adalah program kecil, dan SEMUA yang saya lakukan adalah menghapus spasi di awal baris printfn. Mmmm, sepertinya kompiler F # tidak seperti itu sama sekali. Ya, itu adil.
Dalam F #, spasi SANGAT SANGAT penting, jadi mainkan dengan baik, jika tidak biasakan untuk debugging kesalahan samar seperti yang ditunjukkan di atas, yang disebabkan oleh masalah sederhana ruang semantik yang salah.
Bagaimanapun, ini adalah contoh dari "Hello World". Sampai kita bertemu lagi lain kali, aku berharap yang terbaik untukmu.