2016-05-05 29 views
2

我试图找出背后“柯里化”的因果逻辑,并得出以下结果:为什么哈斯克尔有一个参数

  1. 多个参数函数可以表达为元组(结合多个参数以不同类型作为一个参数)和列表(将多个参数与同一类型组合为一个参数)。所以所有函数都可以表示为单参数函数。
  2. 所以在Haskell中,函数只需要一个参数。我们如何实现多参数函数。
  3. 使用柯里。柯里化是实现多个参数功能的一种方式。

我认为上述逻辑1 - > 2 - > 3是混淆回答“为什么使用咖喱”。对于语句3,还可以将多个元组或列表组合为单个参数来实现多个参数函数。

看起来声明1不是声明2的正确理由。我敢肯定的是2-> 3是正确的推理,但背后的原因是什么?为什么Haskell作为一种函数式语言,只有一个参数?

大多数书籍将语句2视为公认的事实。有人知道2背后的原因吗?还是有人知道“为什么要加油”的正确逻辑?

+0

你问:“为什么要使用咖喱?”,这意味着在某些时候有人认为:“让我们用柯里化来解决我们有的语言设计问题。”但事实并非如此。有人认为,“让我们制作一种简单,优雅,表达,方便,安全和灵活的语言。”解决这些问题的方法是使用具有归纳类型的lambda微积分,一个很好的类型系统以及一种不寻常的减少策略。 “使用柯里化”不是解决这些问题的方法之一,而是解决这些问题的巧妙便捷的工具。 –

+0

如果你想到产品类型的元组(例如:“Bool”有两个居民,“Maybe Bool”有三个居民,(Bool,Maybe Bool)有六个居民),那么函数类型就是指数。由于'e ^(x * y)=(e^x)^ y',您总是可以用类型'(x,y) - > e'将类型为'y - >(x - > e)'。这简直就是咖啡。因为您总是可以重写这些函数(在这种情况下,成本相对较低),所以您不需要*将多参数函数作为一个基本概念,否则会使语言定义复杂化。 –

回答

1

首先,您需要记住Haskell完全基于Lambda微积分。它是建立在科学编程模型上的(尽管它并不意味着该语言只有科学的用途)。

我认为你错了,是因为它可以显示为元组或列表,即使这将是一个非常聪明的解释,它不会只获得一个参数。

Haskell中只需要因为柯里的一个参数:

F(X,Y)= F(X)(Y)

其中f(x)返回一个函数,它有一个参数。 Currying是这整个“函数返回函数”方案。所以,当你f(x)(y)你实际上将'y'传递给'f(x)'函数。

经典的例子:

add :: a->(a->a) 
add(x) = x'+' 

随着 '+' 是一个函数,这意味着它需要另一种说法,我们可以:

add(3)(5) == 8 

我们不是通过这两个参数添加 ,只有一个,所以它可以生成'+',从而得到另一个参数。

当你认为,会有很大的意义,我们可以继续为什么。嗯,主要是合成糖,但是一个非常强大的糖。例如,我们可以定义基于其他功能,而无需指定参数:

add = '+' 

突然我分配值的功能不提的参数(假设当然他们的类型声明匹配)。这有很多其他的可能性,并且可以简化抽象。

这里有好的答案具有良好的例子:https://softwareengineering.stackexchange.com/questions/185585/what-is-the-advantage-of-currying

+0

感谢您的提醒,Haskell基于lamda微积分。我已经通过lambda微积分并找到了我认为非常接近的答案:首先,使用其定义的lamda微积分被证明是通用的,因为所有计算都可以从物理学的角度来看它。其次,lambda定义之一是每个函数只有一个参数。然后,如果lambda演算不能呈现多个参数函数,它可以如何声明为通用的。答案当然是可以的,只能通过使用Curryring(高阶函数)。 – Johnson

+0

是的,你很好。 – eduardogbg

2

功能

f x y = x + y 

具有类型(假设x & yInteger S)

f :: Integer -> Integer -> Integer 

这是相同的

g :: Integer -> (Integer -> Integer) 

这意味着f是一个函数那需要Integer并返回一个新功能,该功能也需要Integer并返回Integer。 Currying是一个过程,一个接受多个参数的函数实际上被评估为一系列带有一个参数的函数。

柯里使得如下

plusTwo :: Integer -> Integer 
plusTwo = f 2 

上面的代码简单地适用于2f结合名称plusTwo到所得到的函数很容易部分地应用的功能。

这使得开发人员将常见行为抽象到一个地方变得非常容易。

4

使用钻营作为多参数的函数的优选方法的决定是基于以下两个原因。首先,Haskell牢牢扎根于使用柯里化的lambda演算。其次,咖喱容易部分应用,这是一个无法形容的语言方面。