traverse
перетворює речі всередині a Traversable
на a Traversable
речей "всередині" an Applicative
, задану функцію, яка робить Applicative
s з речей.
Давайте використаємо Maybe
as Applicative
і перелічимо як Traversable
. Спочатку нам потрібна функція перетворення:
half x = if even x then Just (x `div` 2) else Nothing
Отже, якщо число парне, ми отримуємо половину його (всередині a Just
), інакше отримуємо Nothing
. Якщо все проходить "добре", це виглядає так:
traverse half [2,4..10]
--Just [1,2,3,4,5]
Але ...
traverse half [1..10]
-- Nothing
Причина полягає в тому, що <*>
функція використовується для побудови результату, і коли є один із аргументів Nothing
, ми Nothing
повертаємось.
Інший приклад:
rep x = replicate x x
Ця функція генерує список довжин x
із вмістом x
, наприклад rep 3
= [3,3,3]
. Який результат traverse rep [1..3]
?
Ми отримуємо часткові результати [1]
, [2,2]
і [3,3,3]
використання rep
. Тепер семантика списків як Applicatives
є "приймати всі комбінації", наприклад (+) <$> [10,20] <*> [3,4]
є [13,14,23,24]
.
"Усі комбінації" [1]
і [2,2]
складаються два рази [1,2]
. Всі комбінації два рази [1,2]
і [3,3,3]
шість разів [1,2,3]
. Отже, маємо:
traverse rep [1..3]
--[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]