Python中的traverse_等价物?

时间:2016-01-05 09:27:16

标签: python haskell foldable

Haskell 中,我们有traverse_,这是一个适用于Foldable类型的函数,用于折叠具有应用函数的结构,丢弃任何结果:

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

所以我们可以这样做:

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

什么是 Python 等同于traverse_?至少对于名单?

3 个答案:

答案 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]