【问题标题】:Accumulator factory in HaskellHaskell的蓄能器工厂
【发布时间】:2016-01-21 20:10:09
【问题描述】:

现在,在我开始编程冒险时,我在理解基本概念时遇到了一些问题。这是与 Haskell 或一般功能范式相关的一个。

这里是蓄能器工厂问题的一般性陈述,来自 http://rosettacode.org/wiki/Accumulator_factory

[写一个函数]

  • 接受一个数字 n 并返回一个函数(我们称之为 g),该函数接受一个数字 i,并返回 n,每次调用函数 g(i) 时 i 的累加都会增加。

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

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

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

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

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

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

这里 http://rosettacode.org/wiki/Category:Haskell 据说 Haskell 是纯函数式的。

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

【问题讨论】:

    标签: haskell stateful


    【解决方案1】:

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

    【讨论】:

    • 我认为问题的规则违反了术语“函数”的定义,因此 Haskell 完全有权违反这些规则。
    • @leftaroundabout,我完全同意你的看法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多