首页 \ 问答 \ 累加器如何在Haskell中工作?(How do accumulators work in Haskell?)

累加器如何在Haskell中工作?(How do accumulators work in Haskell?)

你好我试图通过创建以下方法来了解累加器如何工作:

它接收一个数字并创建一个元组:( (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)

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


Hello i am trying to understand how do accumulators work by creating the following method :

It receives a number and it creates a tuple of: (sum [0..nr], [0..nr]). For instance, given 4, it should return (10, [0,1,2,3,4]).

This is the code I have:

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)

I do not understand how the accumulator changes its value, since it is not a function, and thus shouldn't it be immutable? Shouldn't it be like a constant in my case?


原文:https://stackoverflow.com/questions/49444631
更新时间:2019-12-13 07:41

最满意答案

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

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


go is a function that is locally defined using the where keyword and then used directly in the accu function. Have a look here: http://learnyouahaskell.com/syntax-in-functions#where

That means the accumulator does not really change, it is just a different accumulator in each recursive call to the go function. The last line will recursively call the go function with a new accumulator value.

2018-03-23

相关问答

更多

从非UI线程读取时,stdin已损坏(stdin is corrupt when reading it from non UI thread)

在这里找到了解决方案: 从Chrome扩展程序向主机传递“大量”数据非常慢(用C#编写) 问题是stdin.ReadByte操作非常慢,应该用StreamReader(stdin)替换。 Found the soltution here: Very Slow to pass “large” amount of data from Chrome Extension to Host (written in C#) The problem was that stdin.ReadByte is very

粘贴到HTML网站时,Songkick小部件不显示(Songkick widget not displaying when pasted into HTML website)

你忘记了“在中心列的id的末尾。 您还必须更正您的小部件代码 <a href="http://www.songkick.com/artists/7871704" class="songkick-widget" data- theme="light" data-font-color="#000000" data-background-color="#ffffff">2014 Tour Dates</a> You forgot the " at the end of the id of cente

我可以为我的WM_USER添加spy ++ show的自定义评估程序吗?(Can I add custom evaluator for spy++ show to my WM_USER?)

经过一番思考,并阅读了Pat Brenners在间谍++内部的帖子后,我意识到编写这样一个“自定义显示格式化程序”几乎是不可能的。 spy ++将dll注入每个受监视的进程。 当发送或接收WM_msg时,注入的dll中的一个钩子检测到这个并将该信息传递给主spy ++ -process。 编写一个必须存在于注入的dll中的自定义求值程序(或从该dll中吸入)。 这可能导致通常需要避免的并发症。 我只是以“正常”的方式来修改我的源代码。 / L After some more thinking,

闪光滑块还是什么?(flash slider or what?)

它被称为图像滑块。 这是一个开源的: http : //www.hotscripts.com/listing/flash-image-scroller/ 以下是如何制作一个: http : //www.flash-slide-show.com/flash-gallery-tutorial/flash-image-scroller-tutorial.html Its called an Image Slider. Here is an open source one: http://www.hot

触摸在UIBarButtonItem中时阻止UIScreenEdgePanGestureRecognizer(Prevent UIScreenEdgePanGestureRecognizer when a touch is in a UIBarButtonItem)

我很遗憾地使用UIBarButtonItem的自定义UIView属性解决了这个问题,因为UIBarButtonItem是一个试图处理任何触摸事件的笑话。 码: UIButton *theButton = [UIButton buttonWithType:UIButtonTypeSystem]; theButton.frame = CGRectMake(0, 0, 36, 36); [theButton addTarget:self action:@selector(sho

哪个活动首先开始(Which Activity start first)

您在Manifest中声明的活动是您的主要活动,这不是创建应用程序时将启动的第一个活动。 让我们假设您有两个活动菜单和登录,并将您的登录活动设置为清单中的主要活动。 如果您第一次在应用程序中午餐,您将进入登录活动。 但是如果用户在菜单活动中点击主页按钮,并且还杀死了您的应用程序进程,则通过访问其他活动,直到没有用于您的菜单活动的空间或通过使用任务杀手手动终止进程(请注意,存在顺序)在使用强制停止设置关闭应用程序之间,因为它还清除活动堆栈并使用任务杀手作为Android电子市场上的高级任务杀手)。

在selectbox中保存最终表达式(Save the ultimate expression in selectbox)

尝试这个 function save() { var savedmemory = document.getElementById('operations'); var expression = document.getElementById('code').innerHTML; var flag = false; for (var i = 0; i < savedmemory.options.length; ++i) { if (save

如何设置Backbone模型获取的错误处理程序的上下文?(How can I set context of the error handler of Backbone model fetch?)

您正在调用由路径“”触发的索引函数内的_.bindAll() ,因此如果您不触发该路由,它们将永远不会绑定到上下文对象。 我建议为你的路由器创建一个初始化方法,这样你就可以绑定其中任何路由的所有函数。 initialize: function() { _.bindAll(this, "getItemByID", "onModelFetchError", "showError"); } You are calling to _.bindAll() inside of the index

相关文章

更多

最新问答

更多
  • jsPlumb draggable element javascript函数(jsPlumb draggable element javascript function)
  • MVC4:ViewModel(带有radiobuttonlist)在HttpPost之后为空(MVC4: ViewModel (with radiobuttonlist) is empty after HttpPost)
  • 如何在同一帐户上设置“Dev repo”(在prod和团队之间)(How to set up a “Dev repo” (between the prod and the team) on the same account)
  • 如何在tcl中将eth0配置为发送方udp端口(how to configure eth0 as a sender udp port in tcl)
  • 在main方法中进行更改后传递给构造函数的TreeMap实例的行为是什么(What is the behavior of a TreeMap instance passed into a constructor following changes in main method)
  • 在这个的一些属性不同的颜色(Different color in some properties of this)
  • CURL没有返回任何内容(CURL Not returning anything)
  • MVC5注入依赖于城堡windsor的视图(MVC5 injecting dependency on a view with castle windsor)
  • CakePHP AJAX-Call:发生错误:未定义(CakePHP AJAX-Call: An error occured: undefined)
  • 如何用.aidl扩展名创建文件?(how to create a file with .aidl extension?)
  • 无法获得全尺寸动态WordPress灯箱图像显示(Cannot get full size dynamic WordPress lightbox image to display)
  • 使用Jsoup删除元素不起作用(Removing Element with Jsoup doesn't work)
  • 交叉编译ARM的MongoDB C ++驱动程序。(Cross compiling MongoDB C++ driver for ARM. Cannot find Boost Libraries)
  • ProgressDialog没有关闭(ProgressDialog not closing)
  • 单元测试DB中的JPA插入(Unit testing JPA insertion in the DB)
  • 点击谷歌服务对话框中的更新按钮(Click on update button in check google service dialog)
  • 适用于PhoneGap Build的iOS“缺少必需的57x57图标”(“Missing required 57x57 icon” for iOS on PhoneGap Build)
  • MVC ckeditor post编辑器值内联(MVC ckeditor post editor value inline)
  • Angular 2 Pipe - 无法读取未定义的属性'toString'(Angular 2 Pipe - Cannot read property 'toString' of undefined)
  • 安装引导加载程序(Installing bootloaders)
  • 用于确定最终如何包含头文件的工具(Tool to figure out how a header file is eventually being included)
  • 在将字符串转换为int [duplicate]之前检查字符串是否不是数字(Check if string is not a number before converting it to a int [duplicate])
  • 从脚本构建db2数据库以进行构建验证的工具?(Tools to build db2 database from scripts for build verification?)
  • 在偏移之后向FileOutputStream写一个数字(Write a number to FileOutputStream after an offset)
  • Javascript RegEx仅限数字(无特殊字符)(Javascript RegEx for Numbers Only (no special characters))
  • 我可以在PHP的Linux服务器上运行新的COM(“WScript.Shell”)(Can I run new COM(“WScript.Shell”) on linux servers in PHP)
  • 在Backbone.js中放置与视图不直接相关的代码(例如广告,分析等)的位置?(Where to place code not directly related to a view (such as ads, analytics etc) in Backbone.js?)
  • 适用于Mac和PC的一般开发人员必备软件综合列表[关闭](Comprehensive List of Essential Software for General Developers on Mac and PC [closed])
  • 将语言文本转换为模型(Transformation Language Text to Model)
  • 在控制器中的两个方法之间共享变量?(Sharing variables between two methods in a controller?)