ĐẠ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
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
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
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
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
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
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.
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
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
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ử.
Ký
hiệu
hoặc
-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.
>]
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
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ố
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
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