MỤC LỤC
Giống cách mà Python dùng,F# có cú pháp nhóm các phần không phải bằng các cặp từ khoá ,hay cặp ngoặc { } mà bằng cách thụt dòng.
Ở đây,hàm tính lập phương (cub) được định nghĩa ngay trong dấu ngoặc vuông của danh sách để phục vụ mô tả tính chất danh sách.Và nó chỉ được hiểu trong phạm vi danh sách, nếu bạn gọi nó ở ngoài thì vô hiệu.
Cỏch viết này thể hiện rừ thứ tự cỏc hàm được ỏp dụng với một cỳ phỏp gọn gàng hơn cách 1.
Sự áp dụng phép lazy của F# gần với khái niệm deferred operator của LINQ:Biểu thức truy vấn sau khi xác lập không được tính ngay mà phải chờ đến khi có yêu cầu đưa ra(liệt kê) thì mới tính. # -Các tiền xử lý hoặc chỉ thị trình biên dịch -khi sử dụng với một kiểu chỉ ra một kiểu linh hoạt, trong đó đề cập đến một loại hoặc một trong bất kỳ các loại có nguồn gốc từ nó.
Mọi biểu thức của F# đều trả về giá trị, nếu biểu thức không xuất giá trị cụ thể, thì giá trị của kiểu unit sẽ được sử dụng. Giá trị unit được dùng trong lập trình F# trong trường hợp đòi hỏi xuất giá trị những không có giá trị cụ thể mong muốn. Trong lập trình hướng chức năng thuần , khi mà không có hiệu ứng lề trong hàm, trị trả về cuối cùng là kết quả duy nhất của lời gọi hàm.
Các giá trị đặt trong cặp ngoặc tròn,phân cách nhau bằng dấu phẩy (phần tử 1,phần tử 2,..,phần tử n). • Dùng hàm fst để lấy giá trị đầu của tuple, và snd lấy giá trị thứ hai của tuple. • Tuple giúp trả về giá trị phức mà không đòi hỏi khai báo lớp,hay cấu trúc chứa giá trị.
Trong F#, những lựa chọn có thể được gán định danh , giá trị cho kiểu có thể không tồn tại (trường hợp liệt kê) , hoặc tồn tại như 1 kiểu dữ liệu đơn hay tập hợp của các kiểu khác nhau.
Và thay vì phải khai báo phương thức ảo để xử lý tính toán chu vi-diện tích của những hình trên theo lập trình hướng đối tượng, ta có thể dùng so khớp mẫu để tính ra giá trị cần tìm. Kiểu tập hợp phân biệt có thể biểu diễn cấu trúc dữ liệu cây.1 kiểu dữ liệu cây gồm 2 trường hợp : Tip (lá) và Node (nhánh).
Như ta đã biết List trong F# là bất biến nên toán tử @ (và toán tử ::) đều tạo ra list mới làm kết quả chứ không thực hiện ngay trên list hiện thời. List.forall :kiểm tra xem có phải tât cả các phần tử đều thoả mãn điều kiện không. List.sortBy :đưa ra một hàm trả về giá trị làm tiêu chuẩn sắp xếp List.sortWith : đưa ra một hàm làm tham số.
Chúng dùng các biểu thức xây dựng sequence giống như ở list,nhớ dùng dấu {} và có seq ở trước. • Thường sequence ít dùng hơn list nhưng có thể hữu ích trong những trườnghợp cần áp dụng lazy.
Giống cú pháp của list nhưng thêm từ set ở đầu,thực chất đây là phép đổi từ 1 list thành 1 set.
Kiểu array là biểu hiện của hình mẫu lập trình mệnh lệnh trong F#,nó phá vỡ các nguyên lý cơ bản của Functional Programming. Mảng là tập hợp hữu hạn dữ liệu thành viên liên tiếp cùng một kiểu , chỉ mục nền zero. Ngoài ra Array còn nhiều hoạt động khác tương đối giống Array trong các ngôn ngữ .NET khác.
Khai báo đầu tiên không phải là khai báo giản lược,tuy nhiên lại được thường xuyên sử dụng vì khi ta dùng từ khóa struct và end ,ta có thể bỏ qua thuộc tính StructAttribute ,ở dạng khai báo thứ 2. Cấu trúc có thể có hàm khởi tạo và trường dữ liệu khả biến và bất biến, đồng thời có thể khai báo thành viên và cài đặt giao diện. Tuy nhiên,cấu trúc không thể tham gia quan hệ kế thừa,chứa kết buộc let hay do,và không thể chứa trường kiểu chính nó (có thể chứa ở dạng tham chiếu).
Kiểu liệt kê có dạng khai báo tương tự kiểu tập hợp phân biệt với giá trị đơn giản,ngoại trừ việc giá trị không được khởi tạo. Kiểu của các giá trị lựa chọn trong kiểu liệt kê phụ thuộc vào biểu diễn của giá trị , thường mặc định là số nguyên, ta có thể dùng hậu tố kiểu hằng để khai báo giá trị hằng. Khi sử dụng giá trị của kiểu liệt kê ,ta gọi đầy đủ tên kiểu liệt kê và tên giá trị theo dạng <Tên kiểu>.<Tên giá trị>.
Kết buộc giá trị vào 1 định danh 2 lần trở lên sẽ gây lỗi cho phạm vi toàn cục , còn kết buộc ở phạm vi hàm sẽ quyết định giá trị theo biểu thức kết buộc cuối cùng.
Ta thấy tinh1 không gọi đủ tham số của diện tính, nó được xem như một hàm trung gian xử lý một phần.Và ta chỉ có thể gọi in ra hàm tinh3 mà không thêt gọi in ra hàm tinh2, tinh1 vì chưa đủ đối số truyền vào. Recursive Function là hàm gọi lại chính nó, yêu cầu có từ khóa rec theo sao từ khóa let.Gọi lại hàm đề qui trong thân hàm cũng giống như gọi các hàm bình thường khác. Và cũng giống như một định nghĩa hàm thông thường các đối số của biểu thức lambda cú thể được suy ra hoặc chỉ định rừ rằng, và kiểu trả về được suy ra từ biểu thức cuối cùng trong phần thân hàm.
Một biểu thức lambda giống như một định nghĩa hàm, ngoại trừ thay vì sử dụng = thì ký hiệu -> được dùng để tách đối số và phần thân của hàm. Nhiều phương thức dùng trong luồng việc của lớp builder và trả về cấu trúc M<’T> , một kiểu định nghĩa độc lập khác thể hiện dạng của phép toán, chẳng hạn Async<’T> cho luồng việc bất đồng bộ và Seq<’T> cho luồng việc dãy. Khi phân tích 1 biểu thức phép toán, trình biên dịch chuyển biểu thức thành tập lồng nhau liên tiếp các lời gọi hàm bằng việc sử dụng dạng phương thức định nghĩ như trên bảng trên và mã trong biểu thức.
Ta có thể định nghĩa tính chất của biểu thức phép toán bằng cách tạo kiểu builder và định nghĩa phương thức đặc biệt. 1 lớp builder không nhất thiết phải cài đặt hết những phương thức và hỗ trợ tất cả việc dịch biểu thức. Ví dụ,nếu ta không muốn hỗ trợ từ khóa use trong biểu thức phép toán của bạn,ta có thể bỏ qua định nghĩa Use trong lớp builder.
Ta dùng định danh base để sử dụng các phương thức và thuộc tính của lớp cha. Khi khai báo các kiểu mà chúng tham chiếu nhau theo vòng khép kín, ta dùng từ khóa and để kết nối các định nghĩa với nhau.
Các thành viên trực tiếp của lớp cha sẽ được lớp con thừa kế và sử dụng. Kết buộc let và tham số hàm khởi tạo là riêng tư sẽ không được kiểm soát bởi lớp con.
Một lớp được xem là trừu tượng khi nó có phương thức trừu tượng được khai báo nhưng chưa định nghĩa. Nếu không có khai báo phương thức trừu tượng chưa định nghĩa,không nên dùng thuộc tính AbstractClass. // An abstract method that is given a default implementation // is equivalent to a virtual method in other .NET.
// Rotating a circle does nothing, so use the wildcard // character to discard the unused argument and.
Toán tử tiền tố được đặt ở trước toán hạng, như là hàm, còn toán tử trung tổ đặt giữa 2 toán hạng. Toán tử có thể là tiền tố hay trung tố, hoặc là cả hai tùy theo ngữ cảnh toán học. For example, // consider operators that support other integral data types, // with fractions, on the left side and the right side for each.
Chuyển kiểu giữa các kiểu đối tượng gồm 2 dạng : ép kiểu lên,và ép kiểu xuống. Ép kiểu lên chuyển từ kiểu kế thừa thành kiểu gốc, trong khi ép kiểu xuống chuyển từ kiểu cha xuống kiểu con, và ép kiểu chỉ thành công khi đối tượng là thể hiện của đúng kiểu cần chuyển.
Ta có thể ghi chú kiểu cho hằng với đơn vị trong ngoặc nhọn, chú ý là không có khoảng trắng giữa giá trị và đơn vị. Đơn vị đo lường được sử dụng trong quá trình biên dịch nhằm kiểm tra tính hợp lý của toán học,do vậy nó không ảnh hưởng đến hiệu năng của ứng dụng. Đơn vị đo lường có thể áp dụng cho nhiều kiểu , không chỉ là chấm động hay số nguyên, tuy nhiên, chỉ có chấm động,số nguyên có dấu và số thập phân hỗ trợ lượng số theo chiều.
Định danh cho mẫu có thể là giá trị hằng,1 trường hợp của tập hợp phân biệt, 1 định danh ngoại lệ hay 1 mẫu active (cho phép ta định nghĩa mẫu so khớp phức hợp). Mệnh đề kết buộc giá trị khớp được với 1 tên có thể dùng cho biểu thức thực thi , trong trường hợp mẫu dùng trong 1 kết buộc let, tên thêm hoạt động ở tầm cục bộ. Mẫu so khớp bản ghi dùng để phân rã ra giá trị các trường dữ liệu, mẫu không tham chiếu tất cả trường , những trường bị bỏ qua sẽ không bị kết xuất cho so khớp.
Mặc dù biểu thức for.to khá giống với phát biểu điều khiển truyền thống của lập trình tuần tự, kết quả trả về của thân biểu thức phải là unit.
Do mẫu không sử dụng các giá trị khác hằng nên nếu ta muốn so sánh cụ thể hơn thành phần,thì ta sử dụng mệnh đề when. Khác với những ngôn ngữ khác, if.then.else là biểu thức chứ không phải là phát biểu điều khiển. Nếu kiểu của trị trả về ở nhánh then khác unit thì trị trả về ở nhánh else cũng phải cùng kiểu.