Enum và Record trong Haskell
TIL
589
@100daysTIL
72
Haskell
17
White

Huy Trần viết ngày 12/02/2018

#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 EqShow 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

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Huy Trần

109 bài viết.
1587 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
155 46
Tại sao phải viết blog kĩ thuật? Có rất nhiều bài viết trên mạng nói về vấn đề tại sao một lập trình viên nên thường xuyên viết các bài blog kĩ thu...
Huy Trần viết 3 năm trước
155 46
White
149 39
(Ảnh) Tiếp tục sêri (Link) lần này, chúng ta sẽ cùng tìm hiểu và mô phỏng lại một chức năng mà mọi người đang bắt đầu sử dụng hằng ngày, đó là chứ...
Huy Trần viết 2 năm trước
149 39
White
104 17
Phần 1: Tự truyện Tui và Toán đã từng là hai kẻ thù không đội trời chung trong suốt hơn mười lăm năm ròng rã. Ngay từ ánh nhìn đầu tiên đã ghét nh...
Huy Trần viết 2 năm trước
104 17
Bài viết liên quan
White
2 1
Javascript inititalValue trong reduce() có quan trọng không? Day 41: Đọc code mẫu về hàm reduce() trong (Link), thấy hàm reduce() khá "đơn giản"....
Minh-Trung Nguyễn viết 3 tháng trước
2 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
109 bài viết.
1587 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!