Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Enum và Record trong Haskell
#Day009
Sau khi kết thúc bài trước thì chúng ta đã biết cách đọc code Haskell cơ bản.
Hôm nay tiếp tục với một thứ hữu ích hơn, đó là khai báo Enum và Record (giống Object trong JavaScript).
Enum
Để khai báo enum trong Haskell, chúng ta dùng cú pháp:
data <tên> = ...
-- Ví dụ:
data Month = Jan | Feb | Mar | Apr | May | Jun | Jul
| Aug | Sep | Oct | Nov | Dec
Để tạo một biến bằng enum này chúng ta chỉ cần tạo và gán giá trị của enum:
monthOfBirth = Sep
Nếu chúng ta kiểm tra type của monthOfBirth
thì sẽ có kết quả như thế này:
ghci> :t monthOfBirth
monthOfBirth :: Month
Record
Đối với dữ liệu có cấu trúc phức tạp hơn, chúng ta có thể dùng record, khai báo như sau:
-- Khai báo không có field name
data Phone = Phone String String
-- hoặc khai báo với field name
data Person = Person
{ name :: String
, age :: Int
}
Cách sử dụng record mới cũng rất đơn giản:
-- Khai báo không dùng field name
phone = Phone "iPhone" "Apple"
actress = Person "Sakurai" 18
-- Khai báo dùng field name
actress = Person { name = "Sakurai", age = 18 }
Deriving
Typeclass có thể hiểu là các interface, khai báo sẵn một số hàm để quy định behavior của một kiểu. Ví dụ: Eq
, Ord
, Enum
, Bounded
, Show
, Read
.
Deriving là cách mà chúng ta implement các hàm của các typeclass này cho một kiểu mà chúng ta định nghĩa ra.
Ở thời điểm này, nếu chúng ta thực hiện một số thao tác trên cá kiểu mà chúng ta đã tạo ra ở trên, ví dụ:
-- So sánh
firstMonth = Sep
secondMonth = Feb
result = firstMonth == secondMonth
-- In
print phone
Cả hai trường hợp trên đều không compile được:
datatypes.hs:20:8: error:
• No instance for (Show Phone) arising from a use of ‘print’
• In the expression: print phone
In an equation for ‘main’: main = print phone
Chúng ta phải dùng từ khóa deriving
để implement các typeclass Eq
và Show
cho các kiểu dữ liệu này:
data Month = Jan | Feb | Mar | Apr | May | Jun | Jul
| Aug | Sep | Oct | Nov | Dec
deriving (Eq)
data Phone = Phone String String
deriving (Show)
data Person = Person
{ name :: String
, age :: Int
}
deriving (Eq, Show)
huytd 12-02-2018






