Haskell - Loại và Loại Loại
Haskell là một ngôn ngữ chức năng và nó được gõ đúng, 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 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à Type. 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 Classcó thể được coi là một tập hợp các loại Tương tự. Trong chương này, chúng ta sẽ tìm hiểu về các loại Inbuilt khác nhau.
Int
Intlà 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 nằm dướiIntloại lớp. Trong ví dụ sau, hàmfType() sẽ hoạt động theo kiểu được xác định.
fType :: Int -> Int -> Int
fType x y = x*x + y*y
main = print (fType 2 4)
Ở đây, chúng tôi đã thiết lập loại hàm fType() như int. Hàm có haiint giá trị và trả về một intgiá trị. 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
Số nguyên
Integer có thể được coi là một tập hợ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ữaInt và Integer loại, hãy để chúng tôi sửa đổi 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. Để tránh lỗi này, Hãy để chúng tôi 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
Phao nổi
Hãy xem đoạn mã sau. Nó cho thấy cách Float type hoạt động 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
Gấp đôi
Doublelà 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
Boollà 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ứ điều gì trong một trích dẫn duy nhất được coi là một Nhân vật. Trong đoạn mã sau, chúng tôi đã sửa đổifType() chức năng 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 fType() chức năng với một chargiá trị của '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 những 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ẽ xem các kiểu khác nhau và các lớp Kiểu làm cho Haskell trở thành một ngôn ngữ được đánh máy mạnh như thế nào.
Loại EQ
EQtype class 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 chuẩn được đề cập ở trên là một phần của EQlớp học. 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ỳ loại nào được đề cập ở trên, chúng tôi đang thực sự gọi đếnEQ loại lớp.
Trong ví dụ sau, chúng tôi đang sử dụng EQ Nhập 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
Loại thông thường Lớp
Ordlà một lớp giao diện khác cung cấp cho chúng tôi chức năng đặt hàng. Tất cảtypes mà chúng tôi đã sử dụng cho đến nay là một phần của điều này Ordgiao diện. 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".
Vui lòng tìm ví dụ dưới đây mà chúng tôi đã sử dụng chức năng "so sánh" của Loại Loại này.
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
Chỉ
Showcó 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 kết quả dưới dạng 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]"
Đọc
Readgiao diện 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ụngread giao diện để đọc giá trị chuỗi và chuyển đổi giá trị tương tự thành giá trị Int.
main = print (readInt "12")
readInt :: String -> Int
readInt = read
Ở đây, chúng tôi đang chuyển một biến Chuỗi ("12") đến readIntphương thức này lần lượt 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
Enumlà một loại lớp Type khác cho phép 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ân vân.
Đoạn mã sau đây cho biết cách tìm giá trị kế tiếp của 12.
main = print (succ 12)
Nó sẽ tạo ra kết quả sau:
sh-4.3$ main
13
Bị ràng buộc
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ụ,Int dữ liệu kiểu 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.
Không
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
Tích phân
Integralcó 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ố nguyên. Int và Integer là các kiểu thuộc lớp Kiểu này.
Nổi
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. Vì thế,Float và Double thuộc loại này.
Loại tùy chỉnh
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à Area. 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 cóArea như một đầu vào và sản xuất Float như đầ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