Haskell: Làm việc với Tuple qua thư viện Data.Tuple

Thư viện Data.Tuple

fst                     :: (a,b) -> a
fst (x,_)               =  x

snd                     :: (a,b) -> b
snd (_,y)               =  y

curry                   :: ((a, b) -> c) -> a -> b -> c
curry f x y             =  f (x, y)

uncurry                 :: (a -> b -> c) -> ((a, b) -> c)
uncurry f p             =  f (fst p) (snd p)

swap                    :: (a,b) -> (b,a)
swap (a,b)              = (b,a)

Thư viện Data.Tuple cung cấp năm hàm hữu ích để xử lý tuple (cặp):

  • fst: Trả về phần tử đầu tiên của một tuple hai phần tử.
  • snd: Trả về phần tử thứ hai của một tuple hai phần tử.
  • swap: Đảo ngược vị trí hai phần tử trong một tuple hai phần tử.
  • curry: Chuyển một hàm nhận tuple hai phần tử thành hàm nhận hai tham số riêng biệt.
  • uncurry: Chuyển một hàm nhận hai tham số thành hàm nhận tuple hai phần tử.

Ví dụ:

Prelude> fst (1,2)
1
Prelude> snd (1,2)
2
Prelude Data.Tuple> curry (\(x,y) -> x+y) 3 4
7
Prelude Data.Tuple> uncurry (\x y -> x+y) (3,4)
7
Prelude> uncurry max (1,2)
2
Prelude> uncurry min (1,2)
1
Prelude Data.Tuple> swap (1,2)
(2,1)

Thư viện Data.Tuple.All

Cài đặt thư viện:

$ cabal install tuple
Installed tuple-0.3.0.2
Prelude> :m +Data.Tuple.All
Prelude Data.Tuple.All> 

Thư viện này延 hỗ trợ xử lý tuple có đến 32 phần tử và introduce loại OneTuple cho tuple một phần tử.

Các hàm chính:

  • selN: Trả về phần tử thứ N trong tuple.
  • updN: Cập nhật phần tử thứ N trong tuple.
  • curryN, uncurryN: Phiên bản cho tuple N phần tử của các hàm curryuncurry.
  • sequenceT: Phiên bản cho tuple của hàm sequence.

Ví dụ:

Prelude Data.Tuple.All> sel1 (1,2,3,4)
1
Prelude Data.Tuple.All> sel4 (1,2,3,4)
4
Prelude Data.Tuple.All> upd1 5 (1,2,3,4)
(5,2,3,4)
Prelude Data.Tuple.All> upd4 5 (1,2,3,4)
(1,2,3,5)
Prelude Data.Tuple.All> sel1 (OneTuple 1)
1
Prelude Data.Tuple.All> upd1 5 (OneTuple 1)
OneTuple 5
Prelude Data.Tuple.All> curryN (\(x,y,z) -> x+y+z) 3 4 5
12
Prelude Data.Tuple.All> uncurryN (\x y z -> x+y+z) (3,4,5)
12
Prelude Data.Tuple.All> sequenceT (print 3, print 4)
3
4
((),())

Thư viện Data.Tuple.Extra

Cài đặt thư viện:

$ cabal install extra
Installed extra-1.6
Prelude> :m +Data.Tuple.Extra
Prelude Data.Tuple.Extra> 

Các hàm chính:

  • first: Áp dụng hàm cho phần tử đầu tiên của tuple.
  • second: Áp dụng hàm cho phần tử thứ hai của tuple.
  • ***: Hàm compose cho hai hàm áp dụng trên các phần tử của tuple.
  • &&&: Hàm create tuple từ kết quả của hai hàm.
  • dupe: Tạo tuple hai phần tử với cùng giá trị.
  • both: Áp dụng hàm cho cả hai phần tử của tuple.

Ví dụ:

Prelude Data.Tuple.Extra> first succ (1,"test")
(2,"test")
Prelude Data.Tuple.Extra> second reverse (1,"test")
(1,"tset")
Prelude Data.Tuple.Extra> (succ *** reverse) (1,"test")
(2,"tset")
Prelude Data.Tuple.Extra> (succ &&& pred) 1
(2,0)
Prelude Data.Tuple.Extra> dupe 12
(12,12)
Prelude Data.Tuple.Extra> both succ (1,2)
(2,3)
Prelude Data.Tuple.Extra> let a = (1,2,3)
Prelude Data.Tuple.Extra> print $ (fst3 a) + (snd3 a) + (thd3 a)
6

Thẻ: Haskell Tuple Data.Tuple curry uncurry

Đăng vào ngày 25 tháng 5 lúc 02:39