traverse
biến những thứ bên trong a Traversable
thành một Traversable
trong những thứ "bên trong" một Applicative
, được cung cấp cho một chức năng tạo nên Applicative
thứ bên ngoài.
Hãy sử dụng Maybe
as Applicative
và liệt kê như Traversable
. Đầu tiên chúng ta cần hàm chuyển đổi:
half x = if even x then Just (x `div` 2) else Nothing
Vì vậy, nếu một số chẵn, chúng ta nhận được một nửa của nó (bên trong a Just
), còn lại chúng ta nhận được Nothing
. Nếu mọi thứ diễn ra "tốt", nó trông như thế này:
traverse half [2,4..10]
--Just [1,2,3,4,5]
Nhưng...
traverse half [1..10]
-- Nothing
Lý do là <*>
hàm được sử dụng để xây dựng kết quả, và khi một trong các đối số là Nothing
, chúng ta sẽ lấy Nothing
lại.
Một vi dụ khac:
rep x = replicate x x
Hàm này tạo ra một danh sách độ dài x
với nội dung x
, ví dụ: rep 3
= [3,3,3]
. Kết quả là traverse rep [1..3]
gì?
Chúng tôi nhận được kết quả một phần [1]
, [2,2]
và [3,3,3]
sử dụng rep
. Bây giờ ngữ nghĩa của danh sách như Applicatives
là "lấy tất cả các kết hợp", ví dụ như (+) <$> [10,20] <*> [3,4]
là [13,14,23,24]
.
"Tất cả các kết hợp" của [1]
và [2,2]
là hai lần [1,2]
. Tất cả các kết hợp của hai lần [1,2]
và [3,3,3]
là sáu lần [1,2,3]
. Vì vậy chúng tôi có:
traverse rep [1..3]
--[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]