Untuk melengkapi jawaban Sibi >>
bisa dilihat sebagai ;
dalam bahasa lain seperti C atau C++..
Ketika Anda melakukannya di C (atau setara dalam bahasa lain)
printf("foo"); printf("batang");
Anda jelas mencetak foobar
(efek samping) tetapi panggilan ke printf
juga memiliki nilai kembalian, yang dalam kasus kami adalah panjang yang dicetak yaitu 3 3. Pernahkah Anda bertanya-tanya apa yang terjadi dengan angka-angka itu? Mereka dibuang, karena di C, expr 1; exp 2, artinya
- evaluasi expr1
- membuang hasilnya
- evaluasi expr2
(Pada saat itu, Anda dapat bertanya pada diri sendiri mengapa kompiler harus repot mengevaluasi expr1 jika ingin membuang hasilnya? Karena efek sampingnya. Dalam kasus printf
efek sampingnya adalah mencetak sesuatu. Anda jarang tertarik pada nilai yang dikembalikan itu sendiri.)
Jadi ;
dapat dilihat sebagai operator yang mengambil 2 ekspresi dan mengembalikan ekspresi baru. Ini persis sama dengan apa yang dilakukan operator >>
.
Saat Anda menulis
print "foo" >> print "bar"
itu persis setara dengan printf("foo");printf("bar")
kecuali (dan itu perbedaan besar) >>
bukanlah sesuatu yang ajaib seperti ;
di C. >>
ini adalah operator yang ditentukan pengguna dan dapat didefinisikan ulang untuk setiap jenis Monad. Inilah sebabnya pemrogram Haskell sangat menyukai Monad : Singkatnya, ini memungkinkan Anda mendefinisikan ulang perilaku ;
Anda sendiri.
Seperti yang kita lihat, di C ;
cukup evaluasi ekspresi dan buang nilainya. Faktanya, ini sedikit lebih rumit karena tidak akan terjadi jika itu adalah break
atau return
. Monad Nothing in the Maybe dapat dilihat sebagai break
atau return
. >>
mengevaluasi ekspresi pertama, dan berhenti jika Nothing
. Kalau tidak, ia akan membuang nilainya dan melanjutkan.
Contoh pertama Anda dapat dilihat di C
(menurut saya ini C yang valid)
3; return
Dan
return; 3
Contoh pertama, hitung 3
, buang nilainya dan kembalikan. Yang kedua, langsung kembali.
Untuk menjawab pertanyaan Anda when is it usefull
? Hampir sepanjang waktu ketika Anda menggunakan IO, meskipun Anda jarang melihatnya.
Daripada menulis
print "foo" >> print "bar"
Haskell menyediakan gula sintaksis yang mengubah (hampir) baris baru menjadi >>
melalui notasi do, jadi Anda akan menulis
do
print "foo"
print "bar"
yang benar-benar setara dengan versi sebelumnya (Faktanya, versi notasi do diubah ke versi sebelumnya oleh kompiler).
Bahkan juga setara dengan (walaupun jarang digunakan)
do print "foo"; print "bar"
Ringkasnya, >>
dapat dilihat setara dengan ;
atau baris baru dalam bahasa lain dengan perbedaan bahwa arti sebenarnya bergantung pada konteks (di mana Monad bertindak). >>
di Mungkin monad berbeda dari >>
di IO Monad.
person
mb14
schedule
20.07.2014