(Vi) 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 (
và )
(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
= even
isEven
-- combine 2 hàm lại với nhau
combineFunc :: Integer -> Integer -> Bool
= isEven (addInteger a b) -- (1) combineFunc a b
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:
= isEven $ addInteger a b -- (2) combineFunc a b
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:
= (isEven .) . addInteger -- (3) combineFunc
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)