traverse_ эквивалент в Python?

В Хаскеле мы имеем traverse_, функция, которая работает на Foldable типы, чтобы сложить структуру с аппликативной функцией, отбрасывая любой результат:

traverse_ :: (Applicative f,Foldable t) => (a -> f b) -> t a -> f ()

Так, например, мы можем сделать это:

traverse_ putStrLn ["Hello, ","world!"]
traverse_ print (Just 3)

Что эквивалентно Python traverse_? Хотя бы для списков?

3 ответа

Просто используйте простой цикл или list(map(...)) или понимание, и не сохраняйте ссылки.

За traverse_ putStrLn ["Hello, ","world!"]:

for i in ["Hello, ", "world!"]:
    print(i)

или же:

list(map(print, ["Hello, ", "world!"]))

или же:

[print(i) for i in ["Hello, ", "world!"]

Обратите внимание, что list(map(...)) и понимание выведет возвращаемое значение [None, None] если вы используете его в интерактивном переводчике. Если вы хотите подавить это там, сохраните ссылку. Если вы используете его в сохраненном скрипте, вам не нужно сохранять ссылку для подавления вывода возвращаемого значения.

Разве это не просто функция высшего порядка, которая принимает в качестве входных данных функцию f, список l и звонки f во всех списках:

def traverse_ (f,l) :
    for li in l :
        f(li)

Это будет работать со списками, кортежами, генераторами, строками,... которые можно рассматривать как эквивалент Foldable,

Используя это в python3 дает:

$ python3
Python 3.4.3 (default, Mar 26 2015, 22:03:40) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def traverse_ (f,l) :
...     for li in l :
...         f(li)
... 
>>> traverse_(print,["Hello, ","world!"])
Hello, 
world!

traverse_ таким образом, в основном сводится к монадическому for петля я думаю. Где Аппликатив выполнен по всем пунктам.

Не уверен, что я правильно понимаю, но, возможно, вы ищете map обертка:

def traverse(f):
    return lambda L : map(f, L)

print traverse(lambda x : x*x) (range(5)) # [0, 1, 4, 9, 16]
Другие вопросы по тегам