首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这些Haskell高阶函数的Python等价物是什么?

这些Haskell高阶函数的Python等价物是什么?
EN

Stack Overflow用户
提问于 2013-02-10 12:19:50
回答 4查看 1.1K关注 0票数 5

Learn You a Haskell For Great Good一书中关于部分函数的章节包含以下代码:

代码语言:javascript
复制
multThree :: (Num a) => a -> a -> a -> a
multThree x y z = x * y * z

ghci> let multTwoWithNine = multThree 9
ghci> multTwoWithNine 2 3
54
ghci> let multWithEighteen = multTwoWithNine 2
ghci> multWithEighteen 10
180

我目前正在使用Python中的functools库,并设法使用它来复制这些函数的行为。

代码语言:javascript
复制
from functools import partial

def multThree(x,y,z):
  return x * y * z

>>> multTwoWithNine = partial(multThree,9)
>>> multTwoWithNine(2,3)
>>> multWithEighteen = partial(multTwoWithNine,2)
>>> multWithEighteen(10)
180

我现在想做的一件事是,看看是否可以复制同一本书中一些更有趣的高阶函数,例如:

代码语言:javascript
复制
zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith' _ [] _ = []
zipWith' _ _ [] = []
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys

然而,我不确定如何做到这一点,或者partial()在这里是否有用。

EN

回答 4

Stack Overflow用户

发布于 2013-02-10 12:34:37

Python的内置map函数的行为类似于Haskell的zipWith

代码语言:javascript
复制
>>> def add(x,y): return x + y
... 
>>> map(add,[1,2,3],[10,20,30])
[11, 22, 33]
票数 5
EN

Stack Overflow用户

发布于 2013-02-10 12:35:13

代码语言:javascript
复制
def add(a, b):
    return a + b

x = [1, 2, 3, 4]
y = [5, 6, 7, 8]

>> map(add, x, y)
[6, 8, 10, 12]

另外,一定要查看Python内置itertools模块:http://docs.python.org/2/library/itertools.html

票数 2
EN

Stack Overflow用户

发布于 2013-02-10 15:33:43

这段Python代码的行为类似于您给出的zipWith'函数:

代码语言:javascript
复制
def zip_with(f, l1, l2):
    if len(l1) == 0 or len(l2) == 0:
        return []
    else:
        return [f(l1[0], l2[0])] + zip_with(f, l1[1:], l2[1:])

但是,与Haskell函数相比,此函数有几个缺点。首先,它看起来不是很好,因为Python没有模式匹配语法;我们必须使用len[0][1:]。第二,Python函数没有以任何方式使用惰性求值,所以zip_with将始终遍历整个列表,即使它可以提前停止。第三个是该函数对结果列表中的每个元素调用一次,而Python的递归限制约为1000个,因此如果输出列表的长度超过1000个元素,则该函数将引发异常。

第二和第三个问题可以使用生成器来解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14794676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档