Tải bản đầy đủ (.docx) (77 trang)

Báo cáo môn công nghệ: FShape

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (518.94 KB, 77 trang )

ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
ĐẠI HỌC QUỐC GIA TP HCM
KHOA CÔNG NGHỆ PHẦM MÊM
Báo cáo Môn Công nghệ .NET
Đề tài F Sharp
Mục lục Trang
Nhận xét của giáo viên
   
...............................................................................................................
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp2
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
...............................................................................................................
   
Giới thiệu một số khái niệm về lập trình khác.
1. Procedural Programing.
Phương pháp lập trình thủ tục chia một chương trình lớn thành các khối chức năng
hay hàm (thủ tục) đủ nhỏ để dễ lập trình và kiểm tra. Mỗi hàm có một điểm bắt đầu và
một điểm kết thúc và có dữ liệu và logic riêng. Trong một hệ thống chương trình, các
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp3
biến có các phạm vi nhìn thấy nhất định. Trong chương trình, các hàm làm việc độc lập
với nhau. Dữ liệu được chuyển đổi qua lại thông qua các tham số gọi hàm. Việc chia
chương trình thành các hàm cho phép nhiều người có thể tham gia vào việc xây dựng


chương trình. Mỗi người xây dựng một hay một số các hàm độc lập với nhau. Phương
pháp này dẫn đến một khái niệm mới – sự trừu tượng hóa. Sự trừu tượng hóa có thể
xem như khả năng quan sát một sự việc mà không cần xem xét đến các chi tiết bên
trong của nó. Trong một chương trình thủ tục, chúng ta chỉ cần biết một hàm nào đó có
thể làm được những công việc cụ thể gì là đủ. Còn làm thế nào để thực hiện công việc
đó là không quan trọng, chừng nào hàm còn tin cậy được thì còn có thể dùng nó mà
không cần phải biết nó thực hiện đúng đắn chức năng của mình như thế nào.
Lập trình thủ tục nghĩa là mã nguồn tập trung vào thủ tục là chính, nơi mà mõi
chức năng thực hiện một nhiệm vụ cụ thể. Khi bạn xử lý qua lại giữa các chức năng thì
mõi chức năng đó xử lý một phần trên dữ liệu của bạn để đưa ra kết quả sau cùng. Do
đó chúc năng là cơ sở của mã và dữ liệu đống vai trò yếu tố thứ yếu sau đó. Do đó điều
này được gọi là Lập trình “định hướng chức năng”.
Lập trình thủ tục đôi khi cũng được sử dụng như từ đòng nghĩa với lập trình bắt
buộc (qui định cụ thể các bước chương trình phải thực hiện để đạt đến trạng thái mong
muốn) xuất phát từ lập trình cấu trúc dựa trên khái niệm về “gọi thủ tục” (procedure
Call).Nóđơn giản là có một loạt các bước tính toán được thực hiện. Bất kỳ một thủ tục
nhất định có thể được gọi tại bất kỳ thời điểm nào trong quá trình thực hiện của một
chương trình, bao gồm cả các thủ tục khác hoặc bản thân nó.
Một số ví dụ điển hình của các chương trình thủ tục là :Linux Kernel , Git , và
Apache Server HTTP .
2. Object Oriented Programing.
Lập trình hướng đối tượng, các dữ liệu đã bị ràng buộc chức năng (được gọi là
“phương thức”) mà xử lý dữ liệu chúng có thể truy cập. Vì vậy, bạn không còn truyền
dữ liệu qua lại giữa các chức năng, bạn chỉ cần gọi các chức năng được gắn kết với dữ
liệu.
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp4
Bạn có thể gọi đây là “lập trình hướng dữ liệu”, nhưng trong OOP, các dữ liệu đã
bị ràng buộc chức năng được biết đến như đối tượng, do đó, nó được gọi là “lập trình
hướng đối tượng”.

Lập trình hướng đối tượng (OOP) là một mô hình lập trình bằng cách sử dụng
“đối tượng“- “cấu trúc dữ liệu” bao gồm các trường dữ liệu và phương thức cùng với
các tương tác của chúng.Kỹ thuật lập trình có thể bao gồm các tính năng như trừu
tượng , đóng gói , gởi thông điệp, module , tính đa hình , và thừa kế .
3. Functional Programing.
3.1.1. Khái niệm
Lập trìnhchức năng là một mô hình lập trình mà xử lý tập trung vào tính toán như
là sự ước lượngcác hàm toán học và tránh các trạng thái và dữ liệu thay đổi. Nó nhấn
mạnh việc áp dụng các chức năng, ngược lại với các chương trình theo phong cách
hướng thủ tục nó nhấn mạnh những chức năng có sự thay đổi trạng thái có nguồn gốc
từ phép tính lambda– một hệ thống chính thức được phát triển trong những năm 1930
để điều tra xác định chức năng và ứng dụng chức năng, đệ quy.Nhiều chức năng ngôn
ngữ lập trình có thể được xem như làtạo nền trên phép tính lambda .
Trong thực tế, sự khác biệt giữa một hàm toán học và khái niệm về một “chức
năng” được sử dụng trong chương trình bắt buộc là các chức năng bắt buộc có thể có
tác dụng phụthay đổi giá trị của chương trình tùy vào trạng thái. Bởi vì điều này chúng
thiếu sự minh bạch tham chiếu , tức là sự biểu hiện cùng một ngôn ngữ có thể dẫn đến
các giá trị khác nhau ở các thời điểm khác nhau tùy thuộc vào trạng thái của các
chương trình thực hiện. Ngược lại, trong các mã chức năng, giá trị đầu ra của một hàm
chỉ phụ thuộc vào các đối số đầu vào ch chức năng đó chức năng, để gọi một hàm f hai
lần với cùng một giá trị cho tham số x sẽ đưa ra cùng một kết quả f (x) cả hai lần. Loại
bỏ các tác dụng phụ có thể làm cho nó dễ dàng hơn để hiểu và dự đoán hành vi của một
chương trình, đó là một trong những động lực chính cho sự phát triển của lập trình chức
năng.
Ngôn ngữ lập trình chức năng, đặc biệt là tính hoàn toàn chức năng của nó, phần
lớn được nhấn mạnh trong giới học thuật hơn là trong phát triển phần mềm thương mại.
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp5
Tuy nhiên, nổi bật ngôn ngữ lập trình chức năng như là lược đồ Erlang , dự án
CAMLvà Haskell đã được sử dụng trong các ứng dụng công nghiệp và thương mại của

nhiều tổ chức. Lập trình chức năng cũng đã sử dụng trong ngành công nghiệp thông
qua cụ lập trình ngôn ngữ- tên miền như R (thống kê), Mathematica (tượng trưng toán
học), J và K (phân tích tài chính).F # trong Microsoft. NET và XSLT ( XML ). SQL và
Lex / Yacc , sử dụng một số yếu tố của lập trình chức năng, đặc biệt là tránh các giá trị
thay đổi.Speadsheet cũng có thể được xem như là ngôn ngữ lập trình chức năng .
Lập trình trong một phong cách thuộc về chức năng cũng có thể được thực hiện
bằng các ngôn ngữ mà không phải là thiết kế đặc biệt cho các lập trình chức năng. Ví
dụ, ngôn ngữ lập trình Perl đã được thành chủ đề của một cuốn sách mô tả cách áp
dụng các khái niệm lập trình chức năng. JavaScript , một trong những ngôn ngữ được
sử dụng rộng rãi nhất hiện nay, kết hợp khả năng lập trình chức năng.
4. Sự ra đời và phát triển của hình mẫu lập trình chức năng.
Những năm 1930,phép tính Lambda được nghiên cứu và xây dựng,tạo cơ sở cho
mô hình hàm trong lập trình.Ngôn ngữ LISP,một đại diện tiêu biểu của ngôn ngữ lập
trình hàm là một trong những ngôn ngữ lập trình cấp cao ra đời đâu tiền.Tuy nhiên,các
ngôn ngữ lập trình hàm,đặc biệt là lập trình hàm thuần tuý thì ít được dùng trong sản
phẩm phần mềm thương mại và chủ yếu dùng trong nghiên cứu,tất nhiên cũng có
những ngôn ngữ nổi tiếng dùng trong công nghiệp như: Scheme,Haskell,Ocaml...
Ta có thể thấy nhiều ngôn ngữ lập trình hàm bổ sung khả năng lập trình hướng đối
tượng để tận dụng sự dễ dàng trong thiết kế GUI.
Ngược lại,nhiều ngôn ngữ hướng đối tượng cũng tiếp cận dần với lập trình hàm nhằm
khai thác những ưu thế về rút gọn code,xử lý song song-tránh hiệu ứng phụ...của lập
trình hàm.Một ví dụ điển hình là các ngôn ngữ trên nền .NET framework đều được bổ
sung kỹ thuật lập trình hàm.Ngôn ngữ F# khá mới mẻ cũng là một ngôn ngữ đa hình
mẫu trong đó được cho rằng là đứng đầu .NET framework về đặc tính lập trình hàm.
F Sharp.
5. F Sharp (F#) là gì?
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp6
F#làngôn ngữ lập trình chức năngtrên nền tảng .NET. Nó kết hợptính ngắn gọn,
khả năng truyền đạt, vàkết cấu của lập trình chức năng với sự hỗ trợ các runtime, các

thư viện, khả năng tương tác, công cụ và mô hình đối tượng của .NET.
Lập trình chức năng từ lâu đã truyền cảm hứng cho các nhà nghiên cứu, học sinh,
và người lập trình cũng như với sự đơn giản và sức mạnh biểu hiện của nó. Lập trình sử
dụng chức năng đang bùng nổ: một thế hệ mới của ngôn ngữ chức năng đang đạt tới sự
hoàn thiện; một số cấu trúc của ngôn ngữ chức năng đã được tích hợp vào ngôn ngữ
như C#, Python, vàVisualBasic; và bây giờ có một cộng đồng chuyên môn về các ứng
dụng thực tế của kỹ thuật lập trình chức năng. Và có những bằng chứng mạnh mẽ
chứng tỏ rằng lập trình chức năng đã tạo ra những thành tựu đáng kể về mặt năng suất
trong những lĩnh vự cứng dụng quan trọng như truy cập dữ liệu, mô hình tài chính,
phân tích thống kê, kĩ thuật học, kiểm tra phần mềm, khoa học thông tin trong sinh học.
Gần đây hơn, lập trình chức năng đã là một phần của sự gia tăng của mô hình lập trình
khai báo, đặc biệt là trong các truy vấn dữ liệu, đồng bộ hóa, và lĩnh vực lập trình song
song.
F# khác với các ngôn ngữ lập trình chức năng khác ở chổ nó bao hàm cả lập trình
bắt buộcvà lập trìnhhướng đối tượng.Nó cũng cung cấp một sự liên kết giữa ngôn ngữ
biên dịch và ngôn ngữ động, kết hợp các đặc ngữ và phong cách lập trình đặc trưng của
ngôn ngữ động với hiệu suất và sự mạnh mẽ của một ngôn ngữ biên dịch. Những người
thiết kế F#đã kế thừa một phong cách thiết kếcho phép bạn có những khía cạnh tốt nhất
và hiệu quả nhất của các mô hình và kết hợp chúng trong khi vẫn đặt trọng tâm chính
về kỹ thuật lập trình chức năng.
F # và .NET cung cấp một cách tiếp cận mới đối với lập trình trên máy tính và nó
sẽ tiếp tục gây ngạc nhiên và thích thú, và việc làm chủ kỹ thuật lập trình chức năng sẽ
giúp bạn trở thành một lập trình viên tốt hơn bất kể ngôn ngữ mà bạn sử dụng. Không
có thời gian nào tốt hơn để học lập trình chức năng, và F# cung cấp con đường tốt nhất
để tìm hiểu và áp dụng các chức năng lập trình trên nền tảng .NET.
6. Lịch sử phát triển.
F# là một biến thể của ML (ngôn ngữ lập trình Metalanguage) và dựa trên nền
tảng của ngôn ngữ lập trình hàm Ocaml.
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp7

Ban đầu được phát triển bởi Don Syme ở Microsoft Research nhưng hiện giờ nó tiếp
tục được phát triển tại Microsoft Developer Division.
F# bắt đầu xuất hiện từ năm 2005 và phiên bản mới nhất hiện nay đó là F# 2.0 (phát
hành ngày 17/08/2010) và là một phần của Visual Studio 2010.
F#bắt đầu vào năm 2002 khi DonSyme và những người khác tại bộ phận nghiên
cứu của Microsoft quyết định để đảm bảo rằng "ML" tiếp cận với thực tế nhưng việc
thiết kế một ngôn ngữ dựa trên lý thuyết đã tìm ra dấu nhấn có chất lượng cao cho nền
tảng .NET. Dự án được gắn liền với việc thiết kế và thực hiện các Generics cho các
.NET Common Language Runtime.Phiên bản chính thức đầu tiên trước phát hành của
F# là trong năm 2005.
F#lấy phần ngôn ngữ cốt lõi từ ngôn ngữ lập trình OCaml, và theo một cách nào
đó nó có thể được gọi là một"OCaml cho. NET" .F# không thể tồn tại mà không có
OCaml, một thành viên trong gia đình của ngôn ngữ lập trình ML, có từ năm
1974.F#cũng rút ra từ Haskell, đặc biệt đối với hai tính năng ngôn ngữ tiên tiến được
gọi là sequence expressions và workflows. Vẫn có những kết nối mạnh mẽ giữa các nhà
thiết kế của những ngôn ngữ nàyvà chồng chéo trong cộng đồng những người sử dụng
của họ. Lý do cơ bản để các nhà thiết kế quyết định tiếp tục phát triển F# là tài liệu
trên trang web dự án củaF#.
Mặc dù có những điểm tương đồng với Ocaml và Haskell, thế nhưng lập trình với
F#là hoàn toàn khác biệt. Trong đó, F# tiếp cận cách suy luận, cách lập trình hướng đối
tượng, và các kỹ thuật ngôn ngữ động thực tế là khác biệt với tất cả các ngôn ngữ chức
năng chính thống khác. Lập trìnht rongF#có xu hướng làm sao để hướng đối tượng hơn
so với các ngôn ngữ hức năng khác. Việc lập trình cũng có xu hướng làm sao đểl inh
hoạt hơn. F# bao hàm các kỹ thuật. NET như nạp động (dynamic loading), gõđộng
(dynamic typing), và ánh xạ (reflection), và nó cũng thêm vào các kỹ thuật như trích
dẫn nhấn mạnh (expression quotatio) và cácmô hình năng động (active patterns).
F# cũng nợ rất nhiều các nhà thiết kế của.NET, người có tầm nhìn về khả năng
tương tác ngôn ngữ giữa C++, Visual Basic, và"ngôn ngữ mà cuối cùng đã trở thành
C#"vẫn đang khuấy động nền công nghiệp máy tính hiện nay. Ngày nay F# rút ra
nhiều từ các cộng đồng lớn xung quanh Cơ Sở Hạ Tầng Ngôn Ngữ Chung (Common

Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp8
Language Infrastructure - CLI). Phiên bản chuẩn này được bổ sung bởi
Microsoft.NETFramework, Mono, và đối tác thực thi môi trường Silverlight của
Microsoft. F# có thể tận dụng các thư việnvà các kỹ thuật được phát triển bởi
Microsoft, rộng hơn là cộng đồng .NET, và cao hơn nữa là cộng đồng mã
nguồnmởMono. Chúng bao gồm hàng trăm thư viện quan trọngvà các ngăn xếp thực
thi chính như truy vấn ngôn ngữ tích hợp sử dụng LINQ của Microsoft.
Một vài sự so sánh thú vị khác.
7. So sánh lập trình thủ tục với lập trình hướng đối tượng.
Trọng tâm của lập trình thủ tục là để phá vỡ một công việc lập trình thành xử lý
trên một tập hợp các biến , cấu trúc dữ liệu , và chương trình con , trong khi trong lập
trình hướng đối tượng đó là để phá vỡ một công việc lập trình cho các đối tượng tương
tự nhau.“Đối tượng” đóng gói dữ liệu và phương thức của riêng mình .Sự khác biệt
quan trọng nhất là lập trình thủ tục trong khi sử dụng các thủ tục để hoạt động trên cấu
trúc dữ liệu, còn lập trình hướng đối tượng thì mõi đối tượng hoạt động trên cơ cấu dữ
liệu của riêng nó.
Danh mục khác nhau giữa hai, mặc dù họ có ngữ nghĩa tương tự:
Procedural Programing Object Oriented Programming
Thủ tục Phương thức
Module Đối tượng
Biến Thuộc tính
Gọi thủ tục Gởi thông điệp
8. So sánh lập trình chức năng với lập trình thủ tục.
Các nguyên tắc module hóa và tái sử dụng code cơ bản là giống nhau vì chúng
đều xuất phát đi lên từ lập trình cấu trúc .
Cả hai đều chấp nhận tái sử dụng code trong các phần khác nhau của các chương
trình trong các thời điểm thực thi khác nhau của một chương trình.
Sự khác nhau giữa hai loại ngày là ngôn ngữ lập trình chức năng loại bỏ hoặc
chứa ít nhất các tính chất bắt buộc của ngôn ngữ lập trình thủ tục.Các tính năng thiết

Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp9
lập nên lập trình chức năng là do nó thiết kế sao cho hỗ trợ các chương trình viết các
nhiều chức năng thuần chất càng tốt.
Trong khi thực hiện, mô hình lập trình thủ tục thực thi chương trình như là một
chuổi các lệnh bắt buộc mà nó hoàn toàn có thể thay đổi trạng thái chia sẽ. Mô hình
ngôn ngữ lập trình thủ tục thực thi như là sự đánh giá các biểu thức phức tạp mà chi
phụ thuộc bởi các đối số và giá trị trả về.
Vì sao F# thú vị?
F# là một ngôn ngữ lập trình chức năng trên .NET. Cũng giống như C# hay
VB.NET,F# có được sự hỗ trợ tiện lợi cho Windows Presentation Foundation(WPF),
Windows Communication Foundation(WCF), Visual Studio Tool cho Office, viết game
với XNA.
Chỉ có điều F# là một ngôn ngữ mới và bạn đang băn khoăn có nên học nó không.Sử
dụng F# để làm gì?Đó là vì với khả năng lập trình chức năng, F# viết các class của
chương trình đơn giản hơn C# -vốn xây dựng OOP theo kiểu viết mệnh lệnh cho các
method.
Lập trình song song và lập trình hướng ngôn ngữ là những đặc điểm nổi trội của
F# và rất hấp dẫn.
Ngoài ra tìm hiểu về F# cho bạn sự hiểu biết rộng ở nhiều hình mẫu lập trình(F# là một
ngôn ngữ có rất nhiều hình mẫu),tạo cơ sở để bạn dễ dàng nắm bắt nhiều công nghệ
tiên tiến.Có kiến thức nên tản về F# giúp bạn hiểu sâu thêm về những đặc tính của lập
trình chức năng được C# và VB.NET sử dụng.
Đặc điểm của F#.
9. F# hỗ trợ lập trình hướng đối tượng
Trong F# cho phép bạn trừu tượng hóa code vào classes và objects, cho phép đơn
giản hóa code của bạn.
9.1. F# hỗ trợ lập trình hàm.
Là một phong cách lập trình tập trung vào những gì mà chương trình sẽ làm chứ
không phải là nó sẽ làm việc như thế nào? Ngoài ra, F# là một ngôn ngữ strongly-typed

mà sử dụng kiểu suy luận, nghĩa là các kiểu dữ liệu không cần phải khai báo rõ ràng bởi
người lập trình mà chúng sẽ được suy ra bởi trình biên dịch trong quá trình biên dịch.
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp10
ví dụ:
let sum (a, b)= a+b
letswap (a, b) =(b, a)
//bạn không cần tường minh a b thuộc kiểu gì
9.2. F# liên kết chặt chẽ với .NET.
F# liên kết chặt chẽ với .NET và cho phép bạn làm được tất cả những gì .NET có
thể. F# biên dịch được tất cả những bản cài đặt theo đặc tả Common Language
Infrastructure(CLI), và file thực thi được tạo ra chạy được trên tất cả những môi trường
có CLI. Điều này có nghĩa là F# không bị giới hạn bởi Windows, mà còn có thể chạy
được trên Linux, Apple Mac OS X và OpenBSD. Hơn thế nữa, F# tích hợp mật thiết
với .NET Framework Base Class Library(BCL). Việc sử dụng BCL trong F# đôi khi
còn đơn giản hơn trong C# hay VB.NET.
Ví dụ:
open System
open System.Window.Forms
9.3. Môi trường tương tác
Môi trường kiểu F# khác hẳn nhưng môi trường ngôn ngữ mà ta quen thuộc và
gần giống với Python hoặc Rubyđây không phải là môi trường thông dịch mà là biên
dịch động tức thời.
F# InteractiveVisual F# cung cấp một cửa sổ tương tác được tích hợp vào môi
trường visual studio. Cửa sổ này cho phép bạn nhập F# code và nó sẽ biên dịch và thực
thi ngay lập tức. Điều này cho phép bạn dễ dàng xây dựng các prototype code
constructor và kiểm tra code khi bạn viết.
Để mở cửa sổ F# Interactive bạn vào: View -> Others Window -> F# Interactive hoặc
dùng tổ hợp phím tắt Ctrl + Alt +F.
Khi bạn code chương trình sẽ biên dịch và thực khi đến khi gặp 2 dấu chấm phẩy

(;;).
Ví dụ:
Ở F# Interactive bạn gõ.
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp11
Open System.Windows.Forms
Let f =new Forms()
f.Visible <- true;;
Thì lập tức hiện ra một form trống.
Sau đó gõ :
f.Text<- “hello world”;;
Thì Form của bạn sẽ lập tức thay đổi tiêu đề thành “hello world”.
10.Cú pháp nhẹ nhàng.
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.
11. Phép so khớp mẫu
Phép so khớp mẫu trông qua có vẻ giống như câu lệnh switch của C#
Tuy nhiên trong F# ta còn có thể viết gọn nữa ,đồng thời xử lý được cả trường hợp
n<0
Theo MSDN,F# cung cấp tất cả 17 công thức dạng mẫu
12.Danh sách tổng quát
 Danh sách của danh sách
Ví dụ:
let list =[[1;3;4];2;[5;6;7;1]]
 Biểu thức mô tả tính chất
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp12
Ví dụ:
Let list=[for i in 1..100 do if i % 3 = 0 then
yield i]

Ngoài ra còn có cách rất tiện như sau:
let list=[3..3..99]
Số 3 để ở giữa chỉ bước tăng
Ngoài ra ta cũng có thể viết như sau :
let list=[3..99,step=3]
let list=[3..i,i+3..99]
let list =
[ l
let cub x= x*x*x
for i in 1..10 -> cub i
]
Ở đâ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.
13.Kiểu tuple
Cái phép nhóm tức thời này rất phù hợp khi đưa ra một câu hỏi,với một tuple ta có
thể lấy được nhiều câu trả lời cùng một lần hỏi.
Ngoài ra,dùng tuple để trả lại nhiều giá trị cho một hàm là điều rất hay.
Tuple cũng có thể cho ta một cách định nghĩa hàm và gọi hàm quen thuộc hơn.
Ví dụ:
let TupleSample1() =
let data = 1,2,3
printfn "data = \n%A" data
let f (a,b,c) = (a+b,b+c,c+a)
let res = f(f(f(data)))
printfn "res = \n%A" res
let r1,r2,r3 = res
printfn "r1 = %d, r2 = %d, r3 = %d" r1 r2 r3
let r4,r5,r6 = f(res)
printfn "r4 = %d, r5 = %d, r6 = %d" r4 r5 r6

TupleSample1()//gọi thực thi hàm
14.Áp dụng một hàm cho từng phần tử của một collection trả về một collection
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp13
Với phép map được trang bị,điều nói trên rất dễ chịu.
let ListSample2() =
let data = [1;2;3;4]
let r1 = data |> List.map (fun x -> x + 1)
printfn "Adding '1' using map = %A" r1
let r2 = data |> List.map string
printfn "Converting to strings using map = %A" r2
let r3 = data |> List.map (fun x -> (x,x))
printfn "Tupling up using map = %A" r3
15.Hàm là tham số của một hàm khác
let apply2 ( f: int ->int ->int) x y = f x y
let mul x y = x * y
let result2 = apply2 mul 10 20
16.Hàm ẩn danh và biểu thức lambda
Hàm ẩn danh là hàm mà không cần phải khai báo trước khi sử dụng mà có thể sử
dụng ngay trong lúc gọi nó.
Ví dụ:
let result4 = apply2 (fun x y -> x * y ) 10 20
17.Hàm trả về một hàm khác:
let LuyThua n = function x -> x**n
Hàm luỹ thừa với 1 tham số n,với n cụ thể hàm này lại trả về một hàm khác(không
có tên) tham số x,với x cụ thể ta có x mũ n.
F# không cần khai báo nhưng nó vẫn là ngôn ngữ định kiểu rất mạnh.Một khi
bạn chỉ ra phép toán ** (mũ) thì F# sẽ suy diễn ra rằng x và n là kiểu float
18.Toán tử |> (ống dẫn xử lý).
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology

Báo cáo Môn Công nghệ .NET Đề tài F Sharp14
Toán tử |> cung cấp cách viết tương đối thoải mái,nhất là trong trường hợp cần thể
hiện rõ sự biến đổi, chẳng hạn như trường hợp hàm hợp:
Bình thường không dùng toán tử ống dẫn:
let x=tan(sin(sqrt(4)))
Nhưng ta có thể viết như sau,sử dụng toán tử |>
let x=4 |> sqrt |> sin |> tan
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.
19.Khái quát hoá tự động:
F# là ngôn ngữ có cơ chế khái quát hoá tự động.
Đây không phải một đặc điểm hay lắm nhưng nó là một đặc điểm rất nên chú ý,chính
xác là buộc phải nắm được cũng như đặc điểm suy diễn kiểu.
Sự kết hợp của khái quát hoá tự động và suy diễn kiểu làm cho chương trình đơn giản
hơn, gọn hơn, tổng quát hơn. Nó cũng tăng khả năng tái sử dụng.
Các ngôn ngữ không có cơ chế khái quát hoá tự động buộc người lập trình phải tính
toán và viết ra một các tườn minh kiểu khái quát nhất của các hàm của họ.
Các hàm mà không phụ thuộc vào kiểu dữ liệu của biến được F# khái quát hoá tự động.
Ví dụ:
let Swap(x,y)=(y,x)
20.Lazy computation(phép tính trễ)
Các phép tính trễ là phép tính mà không được tính ngay mà chỉ được tính khi kết
quả của nó thực sự cần thiết.
Cú pháp:
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp15
let identifier=lazy (expression)
So với cách viết let identifier=expression cách viết lazy có những điểm khác như
sau:
Expression sẽ không được tính ngay và identifier sẽ chưa có giá trị xác định.

Muốn yêu cầu thực hiện phép tính,hãy gọi method Force,khi đó phép tính sẽ được
tính,identifier sẽ nhận được giá trị kết quả.
Chú ý rằng:Ta có thể gọi method Force nhiều lần nhưng phép toán chỉ được tính đúng
một lần mà không cần phải tính lại trong các lần gọi sau.
Ví dụ:
let mutable x =1
let mutable y=2
let z=x+y
let t=lazy(x+y)
x <- 0
Giá trị của z và t như thế nào?
Vì phép tính x+y để đưa kết quả vào z được thực hiện trước phép gán x <- 0
Nên z=1+2=3
Thế còn t,nói nôm na,t sẽ là một đối tượng ghi nhớ công việc tính x+y,công việc
này chưa được tính ngay mà được trì hoãn cho đến khi t bị "thúc ép" bởi method
Force().
Nếu sau x <- 0 ta dùng t.Force() thì khi đó tổng x+y mới được tính và kết quả là
0+2=2
Chú ý khi sau khi force kết quả ra rồi,thì kết quả đó sẽ bị cache.Bây giờ dù có cho
x <- 10 thì đối tượng t vẫn cache giá trị 2
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.
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp16
Danh mục các từ khóa.
Từ
khóa
Mô tả
Abstr

act
-chỉ ra một phương thức không được phép
thực thi hoặc chỉ ra nó là một trừu tượng
And Sử dụng trong bindings đệ qui, khai báo
thuộc tính và khai báo nhiều điều kiện chung
cho tham số
As Dùng trong khai báo lớp.
Dùng trong việc gán cho một tâp hợp (as pattern).
Asser
t
Dùng để xác minh mã trong thời gian gỡ lỗi.
Base Dùng làm tên lớp cơ sơ.
Begi
n
Bắt đầu một khối mã.
Class Khai báo lớp.
Defa
ult
Thực thi một phương thức trừu tượng.Dùng với một
phương thức trừu tượng để tạo ra một phương thức
ảo.
Dele
gate
Khai báo một delegate.
Do Sử dụng trong vòng lặp hoặc thực thi mã bắt buộc.
Done Kết thúc mã cho cú pháp verbose
Dow
ncast
Chuyển sang một kiểu thấp hơn trong chuỗi kế thừa.
Dow

nto
Sử
Elif Điều kiện phân nhánh.
Else Sử dụng trong cú pháp điều kiện phân nhánh.
End -Trong định nghĩa kiểu và mở rộng kiểu cho
biết kết thúc một phần của định nghĩa thành
viên.
-Kết thúc trong cú pháp verbose
Exep
tion
Khai báo ngoại lệ
Exter
n
Phạm vi tương tác của đối tượng khai báo là
trong cùng khối nhị phân hoăc assembly
False Giá trị sai kiểu boolean
finall
y
Sử dụng trong cú pháp try catch ngoại lệ,
khối mã bên trong được thưc hiện dù có xảy
ra ngoại lệ không.
For Sử dụng trong cấu trúc vòng lặp for
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp17
Fun Được sử dụng trong các biểu thức lambda
funti
on
Sử dụng như từ khóa fun, sử dụng trong biểu
thức match
Glob

al
Không gian (namespace) cao nhất trong
.NET
If Câu điều kiện if
In Sử dụng trong vòng lặp for…in, được dùng
trong cú pháp verbose
Inher
it
Được sử dụng để xác định lợp cơ sở hoặc
giao diện
Interf
ace
Sử dụng để khai báo và thực thi các giao
diện.
Inter
nal
Sử dụng để chỉ ra một thành viên có thể
được thấy trong một khối assembly
Lazy Tính toán lazy
Let Được sử dụng để liên kết, kết nối, đặt tên
cho một giá trị hoặc chức năng.
Matc
h
Biểu thức match
Mem
ber
Được sử dụng để khai báo thuộc tính hoặc
phương thức trong kiểu đối tượng.
Muta
ble

Dùng để khai báo một biến, nghĩa là có thể
thay đổi được.
Nam
espac
e
Sử dụng khai báo chung một không gian tên,
dùng để hợp lý tách biệt mã với các mã khác
New Được dùng để kê khai, xác định hay gọi một
cấu trúc tạo ra một đối tượng.Dùng để ràng
buộc một kiểu phải có một hàm tạo nhất
định.
Not Không thực sự là một từ khóa nhưng nó
được dùng trong các ràng buộc tham số
Null Chỉ ra sự vắng mặt của một đối tượng.Cũng
được dùng như một tham số chung
Open Dùng để tạo ra một không gian sử dụng có
sẳn.
Or Sử dụng để so sánh or
overi
de
Dùng để thực hiện việc ghi đè một phương
thức của lớp cơ bản hay trừu tượng.
Priva
te
Giới hạn truy cập đến mã của thành viên.
Publi
c
Được phép truy cập từ bên ngoài thành viên.
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp18

Rec Hàm đệ qui
Retur
n
Trả về giá trị kết quả.
Static Chỉ ra là phương thức có thể được gọi mà
không cần tạo ra một đối tượng cụ thể.
Stuct Khai báo một cấu trúc
Then Sử dụng trong biểu thức điều kiện
To Sử dụng trong vòng lặp
True Giá trị của kiểu boolean
Try Sử dụng trong biểu thức try ..catch..finally
xử lý ngoại lệ
Type Được sử dụng để khai báo một lớp, record,
struct, union, enum
Use Sử dụng trong quản lý tài nguyên
Val Được sử dụng để chỉ ra một giá trị hoặc một
kiểu
Void Kiểu void trong .NET
Whe
n
Được sử dụng trong ràng buộc điều kiện cho
tham số.
Whil
e
Vòng lặp while
With Sử dụng kết hợp với biểu thức match
Danh mục các kí hiệu và toán tử.

hiệu
hoặc

toán
tử
Mô tả
! -Tham chiếu đến ô
-
‘’ Giới hạn một chiểu văn bản.
# -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ó.
$ Sử dụng trong các biến hoặc hàm của trình
biên dịch
% -Tính số dư của phép chia
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp19
-Dùng trong trích dẫn
& -Tính địa chỉ của một giá trị mutable để sử
dụng khi tích hợp với các ngôn ngữ khác.
-Sử dụng trong mẫu AND
&& Tính toán tử đúng/sai và toán tử AND
&&& Tính toán tử bitwise AND
‘ -giới hạn một ký tự đơn
-chỉ ra một tham số kiểu chung chung.
() Đại diện các giá trị duy nhất của unit type
(…) -chỉ ra thứ tự mà biểu hiện được đánh giá.
-giới hạn một tuples
-được sử dụng trong định nghĩa toán tử.
(*…
*)

-giới hạn một chú thích có thể nối qua nhiều
dòng.
* -Phép nhân
-trong các kiểu, chỉ ra ghép trong một tuple.
-được sử dụng trong các đơn vị đo lường
các loại.
** Tính lũy thừa.
+ Tính phép cộng.
, Tách các phần tử trong tuples hoặc các tham
số
- Phép trừ.
-> -trả về đối số và giá trị
-sử dụng trong các biểu thức phức hợp.
. -truy cập các thành viên , chia tách tên cá
nhân trong một tên đầy đủ.
-số thập phân
.. Chỉ định 1 phạm vi
.. .. Chỉ định 1 phạm vi đồng thời có sự tăng
tiến
[…] Truy cập một phần tử mảng.
/ -Phép chia
-sử dụng trong đơn vị đo lường của các loại
// Khởi đầu 1 chú thích
/// Chỉ ra 1 chú thích XML
: Trong một chú thích, tách
:: - Tạo ra một danh sách, vế trái sẽ nối với vế
phải
- Tách các phần của một danh sách.
:= Gán một giá trị cho một tham số.
:> Chuyển một kiểu lên cao hơn.

:? True nếu đúng với mẫu False nếu sai.
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp20
?> Chuyển một kiểu sang kiểu thấp hơn.
; -Tách các biểu thức
- Tách các phần tử của danh sách.
- Tách c ác trường của một record
< So sánh bé hơn
<< Đảo ngược 2 chức năng.
<<< Phép dịch bit trái
<- Gán giá trị cho một biến.
<…> Giới hạn loại tham số.
<> So sánh khác nhau.
<| Ống dẫn kết quả bên phải qua phép tính bên
trái.
<= So sánh bé hơn bằng.
<@...
@>
Mã trích dẫn
<@@
...@
@>
Mã trích dẫn không định kiểu.
= So sánh bằng.
> So sánh lớn hơn.
>>> Dịch bit phải.
>= So sánh lớn hơn bằng.
[…] Giới hạn danh sách.
[|…|] Giới hạn các phần tử của mảng.
[<…

>]
Giới hạn một thuộc tính.
\ Bỏ qua và đi tới ký tự kế tiếp, dùng cho
chuỗi và ký tự.
^ Chỉ định các tham số dạng đó phải được
thực thi ở thời gian dịch chứ không phải ở
thời gian chạy.
^^^ Phép ngoại trừ OR
` Sử dụng trong nội bộ để chỉ ra tham số
chung chung.
{…} Giới hạn chuổi biểu thức và chuổi tính toán.
| Giới hạn mỗi phần tử phù hợp với trường
hợp, sử dụng trong các giá trị liệt kê.
|| Phép OR
|> ống dẫn kết quả bên trái qua phép tính bên
phải.
~~ Khai báo một tình trạng quá tải.
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp21
Độ ưu tiên toán tử
Toán tử Ưu tiên liên đới thực hiện
As Phải
When Phải.
|> Trái
: Phải
Let Không
Function,
fun, match,
try
Không

If Không
-> Phải
:= Phải
‘ Không
Or,|| Trái
&, && Trái.
<, >, =, |, & Trái
^ Phải.
:: Phải
:?>, ?> Không
-, + Trái
*, /. % Trái.
** Phải
| (match) Phải
F sharp hỗ trỡ tùy chỉnh nạp chồng toán tử.
Danh mục Literals
K
iể
u
F
#
Tiền tố/
Hậu tố
Mô tả Ví dụ
Sbyte Y Số nguyên có dấu 8
bit
16y
byte Uy Số nguyên không
dấu 8 bit
16uy

int16 S Số nguyên có dấu
bit
16s
uint16 Us Số nguyên không 16us
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp22
dấu 16 bit
nativeint N Con trỏ cục bộ như
giá trị số nguyên
0x00002D3Fn
unativeint Un Con trỏ cục bộ như
giá trị số nguyên
không dấu
0x00002D3Fn
int64 L Số nguyên 64 bit 16L
uint64 UL Số nguyên không
dấu 64 bit.
16UL
Single
float32
F Dấu chấm động 32
bit
4.14f
Float
double
Dấu chấm động 64
bit
4.14
Bigint I Số nguyên 64 bit 99999999999I
Decimal M , m Kiểu phân số đã cố

định vị trí dấu
chấm
0.7838m
char Kiểu ký tự ‘a’
String Kiểu chuỗi “hello”
byte B Ký tự ASCII ‘a’B
byte[] B Chuỗi ASCII “hello”B
string
byte[]
@ Chuỗi nguyên văn. @”\\abc\\”
Kiểu dữ liệu trong F Shape.
21.Cú pháp của kiểu dữ liệu trong F Shape
Trong F# , mỗi kiểu đều có định dạng ngữ pháp và ta sử dụng các định dạng ấy
trong chú thích kiểu,khai báo phương thức, delegate, chữ ký và các cấu trúc khác… Khi
ta khai báo một cấu trúc chương trình trong trình thông dịch, trình thông dịch in tên cấu
trúc và ngữ pháp của kiểu dữ liệu cho cấu trúc ấy. Cấu trúc ấy có thể chỉ là 1 nhận dạng
cho kiểu tự định nghĩa hay một nhận dạng dựng sẵn cho kiểu int hoặc string, đối với
kiểu phức tạp hơn, thì ngữ pháp sẽ phức tạp hơn.
Kiểu Ngữ pháp Ví dụ
Kiểu cơ sở Typename Int, byte
Kiểu tập hợp : class,
struct , enum , union …
Typename Color
Person
Kiểu tắt Typename Bigint
Kiểu đầy đủ nhận dạng Namespace.typename System.IO.StreamWriter
Kiểu mảng Typename[] Int[]
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp23
Typename array Int array

Kiểu mảng 2 chiều Typename[,] Int[,]
Kiểu mảng 3 chiều Typename[,,] Int[,,]
Kiểu tuple Type1 * type2 Int * string
Kiểu generic Type-params generic-type
Generic-type<type-params>
‘a list
List<’a>
Kiểu cấu trúc cụ thể
(generic cho kiểu cụ thể)
Type-args generic-type
Generic-type<type-args>
Int list
List<int>
Kiểu hàm Type1 -> type2… -> return-
type
Int->int
Kiểu delegate Delegate of type Delegate of int->int
Kiểu mềm dẻo #type #seq<int>
22.Suy diễn kiểu
Cơ chế suy diễn kiểu hỗ trợ lập trình viên không cần khai báo kiểu tường minh
cho dữ liệu mà vẫn đảm bảo kiểu hợp ngữ cảnh và thỏa mãn yêu cầu an toàn kiểu
Ý tưởng của cơ chế suy diễn là lập trình viên không cần mô tả kiểu của cấu trúc
trừ khi trình biên dịch không thể suy diễn kiểu. Bỏ qua khai báo tường minh không có
nghĩa là F# là ngôn ngữ kiểu động hay là ngôn ngữ định kiểu yếu. F# là ngôn ngữ định
kiểu tĩnh, trình biên dịch có thể suy diễn chính xác trong quá trình dịch. Nếu không có
đủ thông tin cho sự suy diễn , lập trình viên cần bổ sung thông tin về kiểu như ghi chú
kiểu .
Khi không khai báo tường minh kiểu,trình biên dịch suy diễn kiểu dựa trên ngữ
cảnh. Nếu không có cách suy diễn ra kiểu cụ thể, trình biên dịch sẽ suy diễn ra kiểu
generic. Nếu mã lập trình không thống nhất, dẫn đến việc không có kiểu suy diễn nào

thỏa mãn thì trình biên dịch sẽ báo lỗi. Kiểu trả về được quy định bởi biểu thức cuối
của hàm .
23.Kiểu cơ sở
Kiểu Kiểu .NET Miêu tả
bool System.Bo
olean
Nhận giá trị true/ false.
byte System.By
te
Giá trị từ 0 đến 255
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp24
sbyte System.Sb
yte
Giá trị từ -128 đến 127
int16 System.Int
16
Giá trị từ -32768 đến 32767.
uint16 System.Ui
nt16
Giá trị từ 0 đến 65535.
Int System.Int Giá trị từ -2,147,483,648 đến
2,147,483,647.
uint32 System.Ui
nt32
Giá trị từ 0 đến 4,294,967,295.
int64 System.Int
64
Giá trị từ -9,223,372,036,854,775,808
đến 9,223,372,036,854,775,807

uint64 System.Ui
nt64
Giá trị từ 0 to
18,446,744,073,709,551,615.
nativeint System.Int
Ptr
Con trỏ cục bộ như giá trị số nguyên.
unativei
nt
System.Ui
ntPtr
Con trỏ cục bộ như giá trị số nguyên
không dấu
char System.Ch
ar
Giá trị ký tự unicode.
string System.Str
ing
Chuỗi unicode
decimal System.De
cimal
Số dấu chấm động 64 bit
unit System.Un
it
void System.Vo
id
Không giá trị hoặc không kiểu.
float32,
single
System.Si

ngle
Kiểu dấu chấm động 32 bit
Float64,
double
System.Do
uble
Đấu chấm động 64 bit
24. Kiểu unit
Kiểu unit là kiểu dữ liệu đại diện cho tính hiện diện của giá trị , kiểu unit chỉ có 1
giá trị và được xem như là 1 thay thế khi không có giá trị khác tồn tại hoặc không cần
thiết.
Author:Lê Phước Thành –SoftWare Engineer factury of University Information Teachnology
Báo cáo Môn Công nghệ .NET Đề tài F Sharp25

×