Enum và Record trong Haskell
TIL
496
@100daysTIL
41
Haskell
13
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

100 bài viết.
1439 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
144 43
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 hơn 2 năm trước
144 43
White
143 37
(Ả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 hơn 1 năm trước
143 37
White
96 16
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 gần 2 năm trước
96 16
Bài viết liên quan
White
18 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết hơn 1 năm trước
18 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
100 bài viết.
1439 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á!