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

115 bài viết.
1762 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
166 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 3 năm trước
166 46
White
151 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 2 năm trước
151 39
White
108 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 hơn 2 năm trước
108 17
Bài viết liên quan
White
14 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 hơn 3 năm trước
14 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 hơn 3 năm trước
4 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


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