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]