Haskell - Chức năng

Haskell là một ngôn ngữ chức năng và nó được nhập đúng cách, có nghĩa là kiểu dữ liệu được sử dụng trong toàn bộ ứng dụng sẽ được trình biên dịch biết tại thời điểm biên dịch.

Loại kiểu sẵn có

Trong Haskell, mọi câu lệnh được coi là một biểu thức toán học và phạm trù của biểu thức này được gọi là Kiểu . Bạn có thể nói rằng “Kiểu” là kiểu dữ liệu của biểu thức được sử dụng tại thời điểm biên dịch.

Để tìm hiểu thêm về Type , chúng ta sẽ sử dụng lệnh “: t”. Nói một cách chung chung, Type có thể được coi là một giá trị, trong khi Type Class có thể được coi là một tập hợp các loại Type tương tự nhau. Trong chương này, chúng ta sẽ tìm hiểu về các loại Inbuilt khác nhau.

Int

Int là một lớp kiểu đại diện cho dữ liệu kiểu Số nguyên. Mọi số nguyên trong phạm vi từ 2147483647 đến -2147483647 đều thuộc loại Int . Trong ví dụ sau, hàm fType () sẽ hoạt động theo kiểu của nó được xác định.

fType :: Int -> Int -> Int 
fType x y = x*x + y*y
main = print (fType 2 4) 

Ở đây, chúng ta đã đặt kiểu của hàm fType () là int . Hàm nhận hai giá trị int và trả về một giá trị int . Nếu bạn biên dịch và thực thi đoạn mã này, thì nó sẽ tạo ra kết quả sau:

sh-4.3$ ghc -O2 --make *.hs -o main -threaded -rtsopts 
sh-4.3$ main
20

Integer

Số nguyên có thể được coi là một tập siêu của Int . Giá trị này không bị giới hạn bởi bất kỳ số nào, do đó một Số nguyên có thể có độ dài bất kỳ mà không có bất kỳ giới hạn nào. Để thấy sự khác biệt cơ bản giữa kiểu Int và Integer , chúng ta hãy sửa đổi đoạn mã trên như sau:

fType :: Int -> Int -> Int 
fType x y = x*x + y*y 
main = print (fType 212124454 44545454454554545445454544545)

Nếu bạn biên dịch đoạn mã trên, thông báo lỗi sau sẽ được đưa ra:

main.hs:3:31: Warning:            
   Literal 44545454454554545445454544545 is out of the Int range -
   9223372036854775808..9223372036854775807 
Linking main ...

Lỗi này xảy ra do hàm fType () của chúng tôi mong đợi một giá trị kiểu Int và chúng tôi đang chuyển một số giá trị kiểu Int lớn thực sự. Để tránh lỗi này, Chúng ta hãy sửa đổi kiểu “Int” bằng “Số nguyên” và quan sát sự khác biệt.

fType :: Integer -> Integer -> Integer 
fType x y = x*x + y*y 
main = print (fType 212124454 4454545445455454545445445454544545)

Bây giờ, nó sẽ tạo ra kết quả sau:

sh-4.3$ main
1984297512562793395882644631364297686099210302577374055141

Float

Hãy xem đoạn mã sau. Nó cho thấy cách hoạt động của kiểu Float trong Haskell

fType :: Float -> Float -> Float 
fType x y = x*x + y*y 
main = print (fType 2.5 3.8)

Hàm nhận hai giá trị float làm đầu vào và mang lại một giá trị float khác làm đầu ra. Khi bạn biên dịch và thực thi mã này, nó sẽ tạo ra kết quả sau:

sh-4.3$ main
20.689999 
Double
Double là một số dấu phẩy động với độ chính xác gấp đôi ở cuối. Hãy xem ví dụ sau:
Double
Double là một số dấu phẩy động với độ chính xác gấp đôi ở cuối. Hãy xem ví dụ sau:
fType :: Double -> Double -> Double 
fType x y = x*x + y*y 
main = print (fType 2.56 3.81)

Khi bạn thực thi đoạn mã trên, nó sẽ tạo ra kết quả sau:

sh-4.3$ main 
21.0697

Bool

Bool là một kiểu Boolean. Nó có thể là Đúng hoặc Sai. Thực thi đoạn mã sau để hiểu cách hoạt động của kiểu Bool trong Haskell:

main = do  
   let x = True 
   
   if x == False 
      then putStrLn "X matches with Bool Type" 
   else putStrLn "X is not a Bool Type" 

Ở đây, chúng tôi đang xác định một biến “x” là Bool và so sánh nó với một giá trị Boolean khác để kiểm tra tính nguyên bản của nó. Nó sẽ tạo ra kết quả sau:

sh-4.3$ main
X is not a Bool Type 

Char

Char đại diện cho các ký tự. Bất cứ thứ gì trong một trích dẫn duy nhất đều được coi là một Nhân vật. Trong đoạn mã sau, chúng tôi đã sửa đổi hàm fType () trước đó của mình để chấp nhận giá trị Char và trả về giá trị Char dưới dạng đầu ra.

fType :: Char-> Char 
fType x = 'K' 
main = do  
   let x = 'v' 
   print (fType x) 

Đoạn mã trên sẽ gọi hàm fType () với giá trị char là ‘v’ nhưng nó trả về một giá trị char khác, đó là ‘K’. Đây là đầu ra của nó

sh-4.3$ main 
'K'

Lưu ý rằng chúng ta sẽ không sử dụng các kiểu này một cách rõ ràng vì Haskell đủ thông minh để bắt kiểu trước khi nó được khai báo. Trong các chương tiếp theo của hướng dẫn này, chúng ta sẽ thấy các kiểu và lớp Kiểu khác nhau làm cho Haskell trở thành một ngôn ngữ được đánh máy mạnh mẽ như thế nào.

EQ Type Class

Lớp kiểu EQ là một giao diện cung cấp chức năng kiểm tra tính bình đẳng của một biểu thức. Bất kỳ lớp Kiểu nào muốn kiểm tra tính bình đẳng của một biểu thức phải là một phần của Lớp Kiểu EQ này.

Tất cả các lớp Loại tiêu chuẩn được đề cập ở trên là một phần của lớp EQ này . Bất cứ khi nào chúng tôi kiểm tra bất kỳ sự bình đẳng nào bằng cách sử dụng bất kỳ kiểu nào được đề cập ở trên, chúng tôi thực sự đang thực hiện một cuộc gọi đến lớp kiểu EQ . Trong ví dụ sau, chúng tôi đang sử dụng Loại EQ nội bộ bằng thao tác “==” hoặc “/ =”

main = do 
   if 8 /= 8 
      then putStrLn "The values are Equal" 
   else putStrLn "The values are not Equal"

Nó sẽ mang lại kết quả sau:

sh-4.3$ main 
The values are not Equal 

Ord Type Class

Ord là một lớp giao diện khác cung cấp cho chúng ta chức năng đặt hàng. Tất cả các loại mà chúng tôi đã sử dụng cho đến nay là một phần của giao diện Ord này . Giống như giao diện EQ, giao diện Ord có thể được gọi bằng cách sử dụng “>”, “<“, “<=”, “> =”, “so sánh”.

ví dụ dưới đây, nơi chúng tôi đã sử dụng chức năng “so sánh”

main = print (4 <= 2) 

Tại đây, trình biên dịch Haskell sẽ kiểm tra xem 4 có nhỏ hơn hoặc bằng 2. Vì không, mã sẽ tạo ra kết quả sau:

sh-4.3$ main 
False

Show

Show có chức năng in đối số của nó dưới dạng Chuỗi. Dù có thể là đối số của nó, nó luôn in ra kết quả dưới dạng một Chuỗi. Trong ví dụ sau, chúng tôi sẽ in toàn bộ danh sách bằng giao diện này. “show” có thể được sử dụng để gọi giao diện này.

main = print (show [1..10]) 

Nó sẽ tạo ra kết quả sau trên bảng điều khiển. Ở đây, dấu ngoặc kép chỉ ra rằng đó là một giá trị kiểu Chuỗi.

sh-4.3$ main 
"[1,2,3,4,5,6,7,8,9,10]" 

Read

Giao diện Đọc thực hiện tương tự như Hiển thị, nhưng nó sẽ không in kết quả ở định dạng Chuỗi. Trong đoạn mã sau, chúng tôi đã sử dụng đọc giao diện để đọc một chuỗi giá trị và chuyển đổi tương tự thành một giá trị Int.

main = print (readInt "12") 
readInt :: String -> Int 
readInt = read 

Ở đây, chúng ta đang chuyển một biến Chuỗi (“12”) đến phương thức readInt , lần lượt nó sẽ trả về 12 (một giá trị Int) sau khi chuyển đổi. Đây là đầu ra của nó –

sh-4.3$ main 
12

Enum

Enum là một loại lớp Type khác cho phép thực hiện chức năng tuần tự hoặc có thứ tự trong Haskell. Lớp Type này có thể được truy cập bằng các lệnh như Succ, Pred, Bool, Char , v.v. Đoạn mã sau đây cho biết cách tìm giá trị kế tiếp của 12.

Enum
Enum là một loại lớp Type khác cho phép thực hiện chức năng tuần tự hoặc có thứ tự trong Haskell. Lớp Type này có thể được truy cập bằng các lệnh như Succ, Pred, Bool, Char , v.v.
Đoạn mã sau đây cho biết cách tìm giá trị kế tiếp của 12.
main = print (succ 12)

main = print (succ 12) 

Nó sẽ tạo ra kết quả sau:

sh-4.3$ main
13

Bounded

Tất cả các loại có giới hạn trên và dưới đều thuộc Loại Loại này. Ví dụ: dữ liệu kiểu Int có giới hạn tối đa là “9223372036854775807” và giới hạn tối thiểu là “-9223372036854775808”. Đoạn mã sau đây cho thấy cách Haskell xác định giới hạn tối đa và tối thiểu của loại Int.

main = do 
   print (maxBound :: Int) 
   print (minBound :: Int) 

Nó sẽ tạo ra kết quả sau:

sh-4.3$ main
9223372036854775807
-9223372036854775808

Bây giờ, hãy cố gắng tìm giới hạn tối đa và tối thiểu của các loại Char, Float và Bool.

Num

Lớp kiểu này được sử dụng cho các phép toán số. Các kiểu như Int, Integer, Float và Double thuộc lớp Type này. Hãy xem đoạn mã sau:

main = do 
   print(2 :: Int)  
   print(2 :: Float) 

Nó sẽ tạo ra kết quả sau:

sh-4.3$ main
2
2.0

Integral

Tích phân có thể được coi là một lớp con của Lớp Loại Num. Lớp Num Type chứa tất cả các loại số, trong khi lớp Integral type chỉ được sử dụng cho các số tích phân. Int và Integer là các kiểu thuộc lớp Kiểu này.

Floating

Giống như Integral, Floating cũng là một phần của lớp Num Type, nhưng nó chỉ chứa các số dấu phẩy động. Do đó, Float và Double thuộc loại này.

Custom Type Class

Giống như bất kỳ ngôn ngữ lập trình nào khác, Haskell cho phép các nhà phát triển xác định các kiểu do người dùng xác định. Trong ví dụ sau, chúng tôi sẽ tạo một kiểu do người dùng xác định và sử dụng nó.

data Area = Circle Float Float Float  
surface :: Area -> Float   
surface (Circle _ _ r) = pi * r ^ 2   
main = print (surface $ Circle 10 20 10 ) 

Ở đây, chúng tôi đã tạo một loại mới có tên là Khu vực . Tiếp theo, chúng ta đang sử dụng kiểu này để tính diện tích của một hình tròn. Trong ví dụ trên, “surface” là một hàm lấy Area làm đầu vào và tạo Float làm đầu ra.

Hãy nhớ rằng “dữ liệu” là một từ khóa ở đây và tất cả các loại do người dùng xác định trong Haskell luôn bắt đầu bằng một chữ cái viết hoa. Nó sẽ tạo ra kết quả sau:

sh-4.3$ main
314.15927

Haskell – Chức năng (xem thêm)

Trả lời