2

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

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

例如,我们可以这样做:

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

Python相当于什么traverse_?至少对于列表?

4

3 回答 3

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]如果您想在那里抑制它,请保存参考。如果在保存的脚本中使用它,则不需要保存引用来抑制返回值的输出。

于 2016-01-05T09:37:06.920 回答
1

这难道不是一个简单的高阶函数,它将函数、函数f、列表lf所有列表上的调用作为输入:

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循环。在所有项目上执行应用程序的地方。

于 2016-01-05T09:33:19.963 回答
0

不确定我是否理解正确,但可能是您正在寻找map包装器:

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

print traverse(lambda x : x*x) (range(5)) # [0, 1, 4, 9, 16]
于 2016-01-05T09:36:06.510 回答