Biết các nút K của bạn
Một số cấu trúc mạnh nhất (để chơi gôn) trong các ngôn ngữ chức năng là let ... in ...
.
Sạch tất nhiên, có cái này, và cái gì đó tốt hơn - cái #
.
Một nút là gì?
Clean's #
và ubiquitous |
(mẫu bảo vệ) đều được gọi là 'biểu thức nút'.
Đáng chú ý, họ cho phép bạn để chương trình imperatively- ish trong sạch (mà thực sự tốt ở đây!).
Các #
(let-trước đó):
Cả hai đều tính giá trị của một số nguyên được đưa ra dưới dạng một chuỗi, nhân với tổng số ký tự của nó
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
Lưu ý cách phiên bản #
ngắn hơn và cách chúng tôi có thể xác định lại s
. Điều này hữu ích nếu chúng ta không cần giá trị mà một biến có khi chúng ta nhận được nó, vì vậy chúng ta có thể sử dụng lại tên đó. ( let
có thể gặp vấn đề khi bạn làm điều đó)
Nhưng sử dụng let
dễ dàng hơn khi bạn cần một cái gì đó nhưflip f = let g x y = f y x in g
Các |
(mô hình bảo vệ):
Bảo vệ mẫu của Clean có thể được sử dụng như các ngôn ngữ chức năng khác - tuy nhiên nó cũng có thể được sử dụng như một mệnh lệnh if ... else ...
. Và một phiên bản ngắn hơn của biểu thức chim nhạn.
Ví dụ: tất cả đều trả về dấu của một số nguyên:
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
Tất nhiên, cái cuối cùng sử dụng bộ bảo vệ theo truyền thống là ngắn nhất, nhưng cái đầu tiên cho thấy bạn có thể lồng chúng (nhưng chỉ có hai mệnh đề trả về vô điều kiện có thể xuất hiện trên cùng một dòng trong quy tắc bố cục) và thứ hai cho thấy những gì đầu tiên làm một cách hợp lý.
Một lưu ý:
Bạn có thể sử dụng các biểu thức này về cơ bản bất cứ nơi nào. Trong lambdas, case ... of
, let ... in
vv
import StdEnv
+a and b
(21 byte) nhỏ hơn%[a:r]|a= %r=a;%_=True
(22 byte)? Hoặc nó sẽ làimport StdEnv
+a=True and b=True
(31 byte), trong trường hợp đó nó thực sự ngắn hơn? (Tôi chưa bao giờ lập trình trong Clean, btw.)