Một số ký hiệu cần biết khi học Haskell
TIL
726
@100daysTIL
72
Haskell
18
White

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

Đọc hiểu được type signature là một trong các yếu tố quyết định chuyện bạn có học Haskell được hay không.

Đa số chúng ta khi mới tìm hiểu thường gặp khó khăn trong việc đọc hiểu type signature vì không nắm kĩ các ký hiệu thường dùng, dẫn đến việc khó tiếp thu các khái niệm dù chúng đã được viết một cách khá rõ ràng, ví dụ như Functor, Applicative, và... thứ-mà-ai-cũng-biết-đó-là-cái-gì-đó.

Phần được viết tiếp theo sau đây không có mục đích giúp bạn bao quát hết toàn bộ những ký hiệu được dùng trong Haskell, mà chỉ giúp bạn làm quen với một vài dạng type signature thường gặp, đủ giúp bạn vượt qua sợ hãi để tiếp tục với Haskell :))

Bắt đầu nào.

Hàm

Type signature của một hàm thông thường thì được viết khá đơn giản

-- Hàm nhận vào một tham số kiểu a trả về một tham số kiểu a
something :: a -> a
-- Ví dụ
addOne :: Int -> Int
addOne a = a + 1

Trong trường hợp hàm nhận nhiều tham số.

-- Hàm nhận vào hai tham số kiểu a, trả về một giá trị kiểu a
something :: a -> a -> a
-- Ví dụ
addTwo :: Int -> Int -> Int
addTwo a b = a + b

Một hàm cũng có thể nhận tham số là một hàm khác.

-- Hàm nhận vào một hàm, và một tham số, trả về một giá trị
something :: (a -> a) -> a -> a
-- Ví dụ
calc :: Int -> (Int -> Int) -> Int
calc a f = f a
-- Cách dùng:
calc 5 addOne 
-- Kết quả trả về là 6

Apply và Composition

Apply tức là "áp" một hàm vào một giá trị nào đó, hay nói cách khác là gọi hàm đó. Composition là ghép nhiều hàm lại với nhau, trong Haskell chúng ta có 2 ký hiệu để làm hai việc này:

-- Ký hiệu $ để apply
($) :: (a -> b) -> a -> b
-- Cách dùng:
f $ a = f a
-- Ví dụ:
addOne $ a
-- tương đương với
addOne a

-- Ký hiệu . để composition
(.) :: (b -> c) -> (a -> b) -> a -> c
-- Cách dùng
(f . g) a = f ( g ( x ) )
-- Ví dụ:
(addOne . addOne) 5
-- tương đương với
addOne ( addOne ( 5 ) )

Có thể kết hợp apply và composition để viết code đẹp hơn, ví dụ:

addOne . addOne $ 5
-- tương đương với
(addOne . addOne) 5
-- Bằng cách này ta không cần phải dùng ngoặc để phân biệt nữa

Pattern Matching

Để bài viết này ngắn nhất có thể, nếu bạn chưa biết pattern matching là gì thì cứ Google đi :trollface:

Giả sử với bài toán Fibonacci, chúng ta có công thức:
$$
F(n) = F(n-1) + F(n-2)
$$

Chúng ta có thể giải bài này bằng pattern matching trong Haskell, theo 4 cách viết khác nhau:

fib :: Int -> Int

-- Cách 1
fib 0 = 1
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)

-- Cách 2
fib n
  | n < 2 = 1
  | otherwise = fib (n - 1) + fib (n - 2)

-- Cách 3
fib n = 
  case n of
    0 -> 1
    1 -> 1
    _ -> fib (n - 1) + fib (n - 2)

-- Cách 4
fib n =
  if n < 2
   then 1
   else fib (n - 1) + fib (n - 2)

Hôm nay tạm chừng này cái đã :D

huytd 10-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

119 bài viết.
1962 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
177 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 hơn 4 năm trước
177 46
White
154 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 hơn 3 năm trước
154 39
White
117 19
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 hơn 3 năm trước
117 19
Bài viết liên quan
White
3 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 hơn 1 năm trước
3 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


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