【问题标题】:How do accumulators work in Haskell?累加器如何在 Haskell 中工作?
【发布时间】:2018-03-26 12:51:21
【问题描述】:

您好,我正在尝试通过创建以下方法来了解累加器的工作原理:

它接收一个数字并创建一个元组:(sum [0..nr], [0..nr])。例如,给定4,它应该返回(10, [0,1,2,3,4])

这是我的代码:

accu :: Int -> (Int, [Int])
accu 0  = (0, [0])
accu nr = go (0, []) nr where   --I do not get this line, mainly the first argument
            go (s,ls) 0  = (s, 0:ls)
            go (s,ls) nr = go (s+nr, nr:ls) (nr-1)

我不明白累加器如何改变它的值,因为它不是一个函数,因此它不应该是不可变的吗?在我的情况下,它不应该是一个常数吗?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    go 是使用where 关键字在本地定义的函数,然后直接在accu 函数中使用。看看这里: http://learnyouahaskell.com/syntax-in-functions#where

    这意味着累加器并没有真正改变,它只是每次递归调用go 函数时的不同累加器。最后一行将使用新的累加器值递归调用go 函数。

    【讨论】:

      【解决方案2】:

      为什么不简单地做。

      (\n -> (sum [0..n], [0..n])) 4
      (10,[0,1,2,3,4])
      

      或者这更干净但更长。

      (\n -> (\l -> (sum l, l)) [0..n]) 5
      (15,[0,1,2,3,4,5])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        • 2013-07-21
        • 1970-01-01
        • 2011-05-22
        相关资源
        最近更新 更多