traverseперетворює речі всередині a Traversableна a Traversableречей "всередині" an Applicative, задану функцію, яка робить Applicatives з речей.
Давайте використаємо Maybeas 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]]