给定以下带有两个参数的函数 f,将 map 仅应用于 x 的标准方法是什么?
关于柯里化和偏应用的一点讨论
在 FP 术语中,您的函数 f 是 "uncurried" - 虽然它在概念上需要两个参数,但它们被捆绑在一个产品结构中。在 Python 中,一切都是非咖喱的,一直都是。您必须一次给出所有论点,或者一个都不给出。
要解决这个问题,有各种技巧,但从概念上讲,您只想“咖喱”函数。也就是说,将f(x,y) 转换为f(x),它会返回一个新函数g(y)。
在默认使用柯里化的语言中,您可以轻松地将这个翻译写成:
-- curry: take a function from (x,y) to one from x to a function from y to z
curry :: ((x,y) -> z) -> (x -> y -> z)
curry f x y = f (x, y)
所以curry 将你的咖喱f 及其产品参数分开,并在它们都可用时应用这些参数。反之亦然:
uncurry :: (x -> y -> z) -> ((x,y) -> z)
uncurry f (x,y) = f x y
这与部分应用有何关系?
- Currying 采用一个采用 1 (n-product) 参数结构的函数,并返回一个采用 n 参数的新函数。
- 部分应用采用 n 个参数的函数并将它们应用于 k 个参数,从而产生 n-k 个剩余参数的函数。
在非柯里化语言中,每个参数都可以依次应用(例如,部分地,关于函数的数量)。在柯里化语言中,您必须先使用一些技巧来取消函数的柯里化,如上面的示例所示。
我认为在 curried-by-default 环境中更灵活,因为部分应用程序是免费的。在这样的环境中,将modify a data structure into a pipeline 的函数链接在一起是很常见的。例如。整数修改管道:
(+1) . (*2) . (^3) $ 7
只是一个部分应用的、非柯里化的函数链,由组合而成,每个函数都对前一个函数的输出进行操作。这很好,因为它在视觉上分离了关注点。