Một số ký hiệu cần biết khi học Haskell
TIL
594
@100daysTIL
72
Haskell
17
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

109 bài viết.
1593 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
13 6
Người ta nói "nullable values" là cái "billion dollar mistake". Kể từ ALGOL, chúng ta không thể dùng nullable values/references như một value bình ...
Justin Le viết 3 năm trước
13 6
White
4 2
Trong (Link), tôi có đề cập đến cách bắt đầu với Haskell bằng cách cài đặt Haskell Platform. Sau một thời gian mày mò không biết bao nhiêu thời gia...
viethnguyen viết 3 năm trước
4 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


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