Có thể bạn không biết, nhưng từ phần đầu tiên đến giờ chúng ta liên tục dùng hàm (Function). Chẳng hạn như dấu * là hàm thực hiện phép nhân 2 số, và chúng ta đặt 2 số cần nhân với nhau ở 2 bên trái phải của dấu *
. Tuy nhiên hầu hết các hàm không nhận các tham số là số nguyên thì lại được gọi bằng cách đặt các tham số vào bên phải của tên hàm.
Cách gọi hàm
Thông thường trong các ngôn ngữ mệnh lệnh thì chúng ta hay gọi hàm bằng cách gọi tên, sau đó là cặp dấu ()
, bên trong là các tham số, ngăn cách nhau bới dấu phẩy.
Trong Haskell thì chúng ta gọi hàm bằng cách ghi tên hàm ra, sau đó là các tham số, cách nhau bởi 1 dấu khoảng trống. Ví dụ:
ghci> succ 8 9
Hàm succ có chức năng trả về một giá trị tiếp theo của giá trị được truyền vào, chẳng hạn như succ 8 = 9
, succ 'a' = 'b'
, succ 1.1 = 2.1
Truyền nhiều tham số thì chúng ta chỉ việc ghi các tham số cách nhau bằng 1 dấu khoảng trống. Ví dụ:
ghci> min 9 10 9 ghci> min 3.4 3.2 3.2 ghci> max 101 101 101
Hàm min
lấy số nhỏ nhất giữa 2 số, hàm max
lấy số lớn nhất giữa 2 số.
Các lệnh gọi hàm bao giờ cũng có độ ưu tiên cao hơn các câu lệnh thường, tức là trong một câu lệnh có nhiều lệnh, thì các lệnh gọi hàm sẽ được thực thi đầu tiên. Ví dụ:
ghci> succ 9 + max 5 4 + 1 16 ghci> (succ 9) + (max 5 4) + 1 16
Trong đoạn code trên thì succ 9
và max 5 4
sẽ được gọi trước rồi mới cộng kết quả của 2 hàm này lại và + 1. Cả 2 câu lệnh có dùng ()
và không dùng ()
đều có độ ưu tiên như nhau.
Nếu chúng ta muốn thực hiện các lệnh sau trước thì chúng ta phải bọc các lệnh đó trong cặp dấu ngoặc ()
. Ví dụ:
ghci> max 5 3 * 2 10 ghci> max 5 (3 * 2) 6
Nếu một hàm nhận 2 tham số thì chúng ta có thể viết 2 tham số này ở 2 bên trái và phải của tên hàm. Tuy nhiên với cách gọi này, chúng ta phải ghi tên hàm trong cặp dấu ``
vì Haskell không biết tham số nào truyền vào trước và tham số nào truyền vào sau. Ví dụ:
ghci> 5 `max` 3 5 ghci> max 5 3 5
Định nghĩa hàm
Để định nghĩa hàm thì đầu tiên chúng ta ghi giống như phần gọi hàm, sau đó thêm dấu = và bắt đầu ghi các câu lệnh bên trong hàm đó. Ví dụ:
ghci> doubleMe x = x + x
Ở đoạn code trên chúng ta định nghĩa hàm doubleMe,
nhận vào 1 tham số tên là x
. Hàm này sẽ x2 tham số này. Sau đó chúng ta có thể dùng như bình thường:
ghci> doubleMe 9 18 ghci> doubleMe 8.3 16.6
Chúng ta có thể dùng hàm trên bên trong phần định nghĩa của hàm khác. Ví dụ:
ghci> tripleMe x = doubleMe x + x ghci> tripleMe 3 9