首页 文章

Haskell的蓄能器工厂

提问于
浏览
2

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

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

[写一个函数]取一个数字n并返回一个函数(让它称之为g),取一个数字i,并返回n,从函数g(i)的每次调用中累加i . 适用于任何数字类型 - 即可以同时使用整数和浮点数并返回可以同时采用整数和浮点数的函数 . (仅仅将所有输入转换为浮点数是不够的 . 只看到整数的累加器必须返回整数 . )(即,如果语言不允许数字多态,则必须使用重载或类似的东西)生成函数返回传递给它们的每个数字的总和,而不仅仅是最近的数字 . (这需要一个状态来保存累积值,这反过来意味着纯函数语言不能用于此任务 . )返回一个真正的函数,这意味着你可以使用任何你可以使用的函数在程序的文本中以通常的方式定义 . (请遵循此处的语言约定 . )不会以可能导致其他代码无意中修改它们的方式存储累积值或返回的函数 . (没有全局变量或其他类似的东西 . )

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

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

这里http://rosettacode.org/wiki/Category:Haskell据说Haskell纯粹是功能性的 .

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

1 回答

  • 4

    Haskell解决方案实际上并不完全遵循挑战规则 . 特别是,它违反了函数"Returns a real function, meaning something that you can use wherever you could use a function you had defined in the ordinary way in the text of your program."而不是返回实函数的规则,它返回一个 ST 计算,该计算产生一个本身产生更多 ST 计算的函数 . 在 ST "state thread"的上下文中,您可以创建和使用可变引用( STRef ),数组和向量 . 但是,在状态线程之外的这个可变状态不可能污染纯代码 .

相关问题