在 Haskell 中,我们有traverse_
,这是一个适用于Foldable
类型的函数,用于折叠具有应用函数的结构,丢弃任何结果:
traverse_ :: (Applicative f,Foldable t) => (a -> f b) -> t a -> f ()
所以我们可以这样做:
traverse_ putStrLn ["Hello, ","world!"]
traverse_ print (Just 3)
什么是 Python 等同于traverse_
?至少对于名单?
答案 0 :(得分:2)
只需使用简单的循环,或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]
。如果要在那里禁止它,请保存引用。如果您在保存的脚本中使用它,则不需要保存引用来抑制返回值的输出。
答案 1 :(得分:1)
这不是一个更高阶的函数,它将函数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_
因此基本上归结为我认为的monadic for
循环。如果对所有项目执行Applicative。
答案 2 :(得分:0)
不确定我是否理解正确,但您可能正在寻找map
包装器:
def traverse(f):
return lambda L : map(f, L)
print traverse(lambda x : x*x) (range(5)) # [0, 1, 4, 9, 16]