(Vi) Haskell function application

Posted on December 30, 2022 by lk
Tags: haskell, function application

Function application ($)

Hãy check thử thông tin của ($) trong ghci

Prelude> :info ($)
($) :: (a -> b) -> a -> b       -- Defined in ‘GHC.Base’
infixr 0 $

Khi bắt đầu học haskell, chúng ta thường thắc mắc tại sao ($) lại được sử dụng khá phổ biến khi code. Hãy xét một vài ví dụ: dòng 152, hoặc dòng 104.

Chúng ta có thể thấy ($) là một cách viết khác tương đương với việc gôm các biểu thức tính toán vào trong cặp dấu () (chú ý không phải là unit type () ) để gôm thứ tự tính toán(evaluation) các biểu thức lại với nhau từ trong ra ngoài.

Xét ví dụ sau:

-- một cách viết khác của hàm add
addInteger :: Integer -> Integer -> Integer
addInteger = (+)

-- một cách viết khác của hàm even
isEven :: Integer -> Bool
isEven = even

-- combine 2 hàm lại với nhau
combineFunc :: Integer -> Integer -> Bool
combineFunc a b = isEven (addInteger a b) -- (1)

Vì type của ($) là:

($) :: (a -> b) -> a -> b       -- Defined in ‘GHC.Base’
-- có thể diễn giải như sau, sau $ sẽ là một hàm số và các tham số của hàm số đó

Cho nên ta có hàm combineFunc được viết lại như sau:

combineFunc a b = isEven $ addInteger a b -- (2)

như thế, chúng ta đã hiểu được ý nghĩa của ($), hi vọng chúng ta sẽ học haskell dễ hơn 🥳.

Mở rộng ra một xíu, tại sao hàm combineFunc lại có thể được viết tương đương thế này:

combineFunc = (isEven .) . addInteger -- (3)

hint: bằng cách sửa dụng function composition và kỹ thuật pointfree trong haskell, chúng ta có thể biến đổi được tương đương từ (2) sang (3)

Tham khảo