【发布时间】:2016-05-05 01:27:33
【问题描述】:
我正在试图弄清楚“Currying”背后的因果逻辑,结果如下:
- 多参数函数可以表示为元组(将多个不同类型的参数组合为一个参数)和列表(将多个具有相同类型的参数组合为一个参数)。所以所有函数都可以表示为单参数函数。
- 所以在Haskell中,函数只有一个参数。我们如何实现多参数函数。
- 使用柯里化。柯里化是一种实现多个争论函数的方法。
我认为上述逻辑 1 -> 2 -> 3 难以回答“为什么使用柯里化”。对于语句 3,也可以将多个元组或列表组合为单个参数来实现多参数功能。
似乎陈述 1 不是陈述 2 的正确原因。我确定 2->3 是正确的推理,但 2 背后的原因是什么?为什么 Haskell 作为一种函数式语言只接受一个参数?
大多数书籍都将陈述 2 视为公认的事实。有人知道2背后的原因吗?或者有人知道“为什么要使用咖喱”背后的正确逻辑吗?
【问题讨论】:
-
你问,“为什么要使用柯里化?”,这意味着在某些时候有人想,“让我们使用柯里化来解决我们遇到的语言设计问题。”。但事实并非如此。有人想,“让我们做一种简单、优雅、富有表现力、方便、安全、灵活的语言吧。”。这些问题的解决方案是使用具有归纳类型的 lambda 演算、良好的类型系统和有点不寻常的归约策略。 “使用柯里化”不是解决任何这些问题的方法,而是解决这些问题的系统中巧合的方便工具。
-
如果您将元组视为产品类型(如:
Bool有两个居民,Maybe Bool有三个居民,(Bool, Maybe Bool)有六个居民),那么函数类型就是指数。由于e^(x * y) = (e^x)^y,您始终可以将(x, y) -> e类型的函数重写为y -> (x -> e)类型的类似函数。简而言之,这是咖喱。因为您始终可以重写此类函数(在这种情况下,成本相对较低),所以您不需要将多参数函数作为基本概念,否则会使您的语言定义复杂化。