Haskell的蓄能器工厂

时间:2015-10-22 13:58:51

标签: haskell stateful

现在,在我开始编程的过程中,我在理解基本概念时遇到了一些问题。这里有一个与Haskell相关的或者通常是功能范例。

以下是累加器工厂问题的一般说明 http://rosettacode.org/wiki/Accumulator_factory

  

[写一个功能]

     
      
  • 取一个数字n并返回一个函数(让我们称之为g),它取一个数字i,并返回n,从函数g(i)的每次调用中累加i。

  •   
  • 适用于任何数字类型 - 即可以同时使用整数和浮点数并返回可以同时采用整数和浮点数的函数。 (简单地将所有输入转换为浮点数是不够的。只看到整数的累加器必须返回整数。)(即,如果语言不允许数字多态,则必须使用重载或类似的东西)

  •   
  • 生成函数,返回传递给它们的每个数字的总和,而不仅仅是最新的数字。 (这需要一个状态来保存累积值,这反过来意味着纯函数语言不能用于此任务。)

  •   
  • 返回一个真实函数,这意味着您可以在任何可以使用您在程序文本中以普通方式定义的函数的地方使用它。 (请遵循您的语言惯例。)

  •   
  • 不会以可能导致其他代码无意中修改它们的方式存储累积值或返回的函数。 (没有全局变量或其他类似的东西。)

  •   
据我所知,

有一个关键点: " [...]创建[...]的功能 生成函数,返回传递给它们的每个数字的总和,而不仅仅是最新的数字。 (这需要一个状态来保存累积值,这反过来意味着纯函数语言不能用于此任务。)"

我们可以在同一个网站上找到一个Haskell解决方案,它似乎就是上面引用的内容。

下面 http://rosettacode.org/wiki/Category:Haskell 据说Haskell纯粹是功能性的。

那么明显矛盾的解释是什么?或者也许没有矛盾,我只是缺乏一些理解?感谢。

1 个答案:

答案 0 :(得分:4)

Haskell解决方案实际上并不完全遵循挑战规则。特别是,它违反了函数"返回一个真实函数的规则,这意味着你可以在任何你可以使用你在程序文本中以普通方式定义的函数的地方使用它。"它不返回实数函数,而是返回ST计算,该计算产生一个本身产生更多ST计算的函数。在ST"状态线程"的上下文中,您可以创建和使用可变引用(STRef),数组和向量。然而,这种可变状态不可能泄漏"国家之外的线程污染纯粹的代码。