traversebiến những thứ bên trong a Traversablethành một Traversabletrong những thứ "bên trong" một Applicative, được cung cấp cho một chức năng tạo nên Applicativethứ bên ngoài.
Hãy sử dụng Maybeas Applicativevà 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 Nothinglạ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 xvớ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ư Applicativeslà "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]]