gpt4 book ai didi

haskell - 柯里化(Currying)函数的实际使用?

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:10 24 4
gpt4 key购买 nike

stackoverflow 上有大量关于如何柯里化(Currying)函数的教程,也有很多问题。然而,在阅读了 The Little Schemer、几本书、教程、博客文章和 stackoverflow 线程之后,我仍然不知道这个简单问题的答案:“柯里化(Currying)有什么意义?”我确实了解如何柯里化(Currying)一个函数,只是不知道“为什么?”在它后面。

有人可以向我解释柯里化(Currying)函数的实际用途吗(在每个函数只允许一个参数的语言之外,使用柯里化(Currying)的必要性当然是非常明显的。)

编辑:考虑到一些来自 TLS 的例子,有什么好处

(define (action kind)
(lambda (a b)
(kind a b)))

相对于

(define (action kind a b)
(kind a b))

我只能看到更多的代码而没有增加灵 active ...

最佳答案

柯里化(Currying)函数的一个有效用途是减少代码量。

考虑三个函数,其中两个几乎相同:

(define (add a b)
(action + a b))

(define (mul a b)
(action * a b))

(define (action kind a b)
(kind a b))

如果您的代码调用add,它会依次调用带有+ 类型的action。与 mul 相同。

您定义了这些函数,就像您在许多可用的命令式流行语言中所做的那样(其中一些已经包括 lambda、柯里化(Currying)和函数世界中常见的其他功能,因为所有这些都非常方便)。

所有 addsum 所做的,都是用适当的 kind 包装对 action 的调用。现在,考虑这些函数的柯里化(Currying)定义:

(define add-curried
((curry action) +))

(define mul-curried
((curry action) *))

它们变得相当短。我们只是通过只传递一个参数 kind 来柯里化(Currying)函数 action,并得到接受其余两个参数的柯里化(Currying)函数。

这种方法允许您编写更少的代码,具有高水平的可维护性。

想象一下函数 action 将立即被重写以接受 3 个以上的参数。如果不使用柯里化(Currying),您将不得不重写 addmul 的实现:

(define (action kind a b c d e)
(kind a b c d e))

(define (add a b c d e)
(action + a b c d e))

(define (mul a b c d e)
(action * a b c d e))

但是柯里化(Currying)让你免于那些令人讨厌且容易出错的工作;你根本不需要重写函数 add-curriedmul-curried 中的一个符号,因为调用函数会提供传递给 Action

关于haskell - 柯里化(Currying)函数的实际使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4888480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com