Ketahui simpul K Anda
Beberapa konstruksi terkuat (untuk bermain golf) dalam bahasa fungsional adalah let ... in ....
Bersih tentu saja, memiliki ini, dan sesuatu yang lebih baik - itu #.
Apa itu simpul?
Clean's #, dan ubiquitous |(pattern guard) keduanya dikenal sebagai 'ekspresi simpul'.
Khususnya, mereka memungkinkan Anda untuk program imperatively- ish di Clean (yang benar-benar baik di sini!).
The #(let-before):
Keduanya menghitung nilai integer yang diberikan sebagai string, dikalikan dengan jumlah karakternya
f s=let i=toInt s;n=sum[toInt c\\c<-:s]in n*i
f s#i=toInt s
#s=sum[toInt c\\c<-:s]
=s*i
Perhatikan bagaimana versi dengan #lebih pendek, dan bagaimana kita dapat mendefinisikan ulang s. Ini berguna jika kita tidak membutuhkan nilai yang dimiliki variabel ketika kita menerimanya, jadi kita bisa menggunakan kembali namanya. ( letdapat mengalami masalah saat Anda melakukannya)
Tetapi menggunakan letlebih mudah ketika Anda membutuhkan sesuatu sepertiflip f = let g x y = f y x in g
The |(penjaga pola):
Pelindung pola Clean dapat digunakan seperti yang ada di banyak bahasa fungsional lainnya - namun juga dapat digunakan seperti keharusan if ... else .... Dan versi yang lebih pendek dari ekspresi ternary.
Misalnya, ini semua mengembalikan tanda integer:
s n|n<>0|n>0=1= -1
=0
s n=if(n<>0)if(n>0)1(-1)0
s n|n>0=1|n<0= -1=0
Tentu saja, yang terakhir yang menggunakan penjaga lebih tradisional adalah yang terpendek, tetapi yang pertama menunjukkan bahwa Anda dapat membuat sarangnya (tetapi hanya dua klausa pengembalian tanpa syarat dapat muncul pada baris yang sama dalam aturan tata letak), dan yang kedua menunjukkan apa yang yang pertama tidak secara logis.
Sebuah catatan:
Anda dapat menggunakan ekspresi ini pada dasarnya di mana saja. Dalam lambdas, case ... of, let ... in, dll
import StdEnv+a and b(21 byte) lebih kecil dari%[a:r]|a= %r=a;%_=True(22 byte)? Atau apakah ituimport StdEnv+a=True and b=True(31 byte), dalam hal ini memang pasti lebih pendek? (Saya belum pernah memprogram dalam Bersihkan, btw.)