首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Haskell到Python:如何进行赛跑?

从Haskell到Python:如何进行赛跑?
EN

Stack Overflow用户
提问于 2016-02-08 21:36:20
回答 6查看 1.1K关注 0票数 3

我最近开始用Python编写代码,我想知道是否有可能返回一个专门处理另一个函数的函数。

例如,在Haskell中,您可以创建一个函数,将5添加到任何给定的数字,如下所示:

代码语言:javascript
复制
sumFive = (+5)

在Python中有可能吗?

EN

回答 6

Stack Overflow用户

发布于 2016-02-08 22:00:02

我认为其他的答案是误解了这个问题。我相信OP是在询问函数的部分应用,在他的例子中,函数是(+)

如果目标不是部分应用程序,则解决方案非常简单:

代码语言:javascript
复制
def sumFive(x): return x + 5

对于Python中的部分应用程序,我们可以使用以下函数:https://docs.python.org/2/library/functools.html#functools.partial

代码语言:javascript
复制
def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*(args + fargs), **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

然后,我们必须将+操作符转换为一个函数(我不认为有像Haskell这样的轻量级语法):

代码语言:javascript
复制
def plus(x, y): return x + y

最后:

代码语言:javascript
复制
sumFive = partial(plus, 5)

不像在Haskell那样好,但效果很好:

代码语言:javascript
复制
>>> sumFive(7)
12
票数 5
EN

Stack Overflow用户

发布于 2016-02-13 10:13:06

Python的设计不支持将多变量函数计算成单变量函数序列(运行)。正如其他答案所指出的,https://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application的相关(但不同的)概念更容易使用函数工具模块中的partial

但是,PyMonad库为您提供了工具,可以在Python中运行,它提供了“用于使用函子、应用函子和单子进行编程的类的集合”。

使用curry装饰器来装饰接受任意数量参数的函数:

代码语言:javascript
复制
from pymonad import curry

@curry
def add(x, y):
    return x + y

这是非常容易咖喱add。该语法与Haskell的语法没有太大的不同:

代码语言:javascript
复制
>>> add5 = add(5)
>>> add5(12)
17    

请注意,这里的addadd5函数是PyMonad的Reader monad类的实例,而不是普通的Reader函数对象:

代码语言:javascript
复制
>>> add
<pymonad.Reader.Reader at 0x7f7024ccf908>

例如,这允许使用更简单的语法来组合函数(在Haskell中很容易实现,在Python中通常要少得多)。

最后,值得注意的是,infix操作符+不是+函数:+调用左操作数的__add__方法,或者右操作数的__radd__方法并返回结果。如果您想使用+ (免责声明:我还没有尝试这样做),则需要为您正在使用的对象装饰这些类方法。

票数 3
EN

Stack Overflow用户

发布于 2016-02-08 21:40:10

是啊。Python支持lambda表达式:

代码语言:javascript
复制
sumFive = lambda x: x + 5

for i in range(5):
   print sumFive(i),

#OUTPUT 5,6,7,8,9
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35279806

复制
相关文章

相似问题

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