首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Haskell rec关键字是如何工作的?

Haskell rec关键字是如何工作的?
EN

Stack Overflow用户
提问于 2011-03-23 13:21:44
回答 2查看 4.5K关注 0票数 26

在arrow do notation中,您可以使用rec关键字编写递归定义。举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rec
    name <- function -< input
    input <- otherFunction -< name

这怎么能进行评估呢?它看起来就像是进入了一个无限循环或者别的什么。我知道它的计算结果是循环箭头组合器,但我也不明白它是如何工作的。

编辑: powers示例非常有用。但是,如何使用do表示法来编写呢?我假设你需要使用rec。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-23 13:33:10

这点魔法是由于haskells的懒惰而起作用的。正如您可能知道的,Haskell在需要时而不是在定义时计算值。因此,如果您不需要直接或稍后输入该值,则可以使用此方法。

rec是使用ArrowLooploop函数实现的。它的定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Arrow a => ArrowLoop a where
        loop :: a (b,d) (c,d) -> a b c

instance ArrowLoop (->) where
        loop f b = let (c,d) = f (b,d) in c

您可以看到:输出只是作为输入进行反馈。它只会被计算一次,因为Haskell只会在需要的时候评估d

下面是一个如何直接使用loop组合器的实际示例。此函数计算其参数的所有幂:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
powers = loop $ \(x,l) -> (l,x:map(*x)l)

(你也可以这样写:powers x = fix $ (x :) . map (*x))

它是如何工作的?好的,无限的权力列表在l的论点中。评估结果如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
powers = loop $ \(x,l) -> (l,x:map(*x)l) ==>
powers b = let (c,d) = (\(x,l) -> (l,x:map(*x)l)) (b,d) in c ==>
powers b = let (c,d) = (d,b:map(*b)d) in d ==> -- Now  we apply 2 as an argument
powers 2 = let (c,d) = (d,2:map(*2)d) in d ==>
         = let (c,(2:d)) = (d,2:map(*2)d) in c ==>
         = let (c,(2:4:d)) = ((2:d),2:map(*2)(2:d)) in c ==>
         = let (c,(2:4:8:d)) = ((2:4:d),2:map(*2)(2:4:d)) in  ==> -- and so on
票数 27
EN

Stack Overflow用户

发布于 2011-03-23 20:46:12

下面是一个真实的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loop f b = let (c,d) = f (b,d) in c

f (b,d) = (drop (d-2) b, length b)

main = print (loop f "Hello World")

这个程序输出"ld“。函数'loop f‘接受一个输入'b’,并创建一个输出'c‘。'f‘正在做的是研究'b’来产生'length b‘,它被返回到循环并绑定到'd’。

在‘循环’中,这个'd=length b‘被输入到'f’中,在丢弃的计算中使用它。

这对于构建不可变的双向链表(也可以是循环的)这样的技巧很有用。它对于遍历一次'b‘也很有用,既可以产生一些解析的'd’(例如长度或最大元素),也可以构建一个依赖于'd‘的新结构'c’。懒惰避免了必须遍历“b”两次。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5405850

复制
相关文章
Goroutine是如何工作的
一、Go语言简介 如果你是Go语言新手,或如果你对"并发(Concurrency)不是并行(parallelism)"这句话毫无赶脚,那么请看一下Rob Pike大神关于这个主题的演讲吧,演讲共30分 钟,我敢保证你在这个演讲上花费30分钟是绝对值得的。 总结一下两者(Concurrency和Parallelism)的不同:"当人们听到并发(Concurrency)这个词时,总是会想起并行 (Parallelism),它们之间有相关性,但却是两个明显不同的概念。在编程领域,并发(Concurrency)是独
李海彬
2018/03/21
2.2K0
HTTPS是如何工作的
大家在浏览网页的时候一定有这样的体验,有一些网站在网址那里会显示一个绿色的挂锁,并且网址中“https”相关的字样也是绿色的,聪明的朋友肯定会问,这些颜色和符号代表什么意思呢?想想大家在上网的时候,经常要输入账号和密码,有时候网购还要输入信用卡信息,如果这些信息被偷了,后果是很严重的。是的,这个绿色的锁就是用来保护大家的信息不被黑客窃取。现在很多网站默认使用HTTPS来保护用户的信息,截止2018年4月,Alexa前100万的网站中,32.2%使用HTTPS作为默认设置,互联网最受欢迎的137971个网站中,57.1%使用了HTTPS;Firefox遥测数据显示,70%的网站使用了HTTPS。
大蟒传奇
2018/07/31
2.4K0
HTTPS是如何工作的
Widget是如何工作的
在前面我们介绍各种各样的Widget,相信大家对Wiget的使用都已经有了自己的认识,今天我们就从底层角度看下Widget是如何工作,是什么支撑起了Wiget这个系统。
flyou
2020/05/28
3.3K0
JavaScript是如何工作的?
当将 JavaScript 文件加载到浏览器中时,JavaScript Engine 会从上到下逐行执行该文件(异步代码将是一个例外,我们将在本系列后面的内容中看到异步代码)。
小丑同学
2020/10/30
2.8K0
JavaScript是如何工作的?
Goroutine是如何工作的
在golangweekly的第36期Go Newsletter中我发现一篇短文"How Goroutines Work" ,其作者在参考了诸多资料后,简短概要地总结了一下 Goroutine的工作原理,感觉十分适合刚入门的Gophers(深入理解Goroutine调度的话,可以参考Daniel Morsing的" The Go scheduler" )。这里粗译如下。 一、Go语言简介 如果你是Go语言新手,或如果你对"并发(Concurrency)不是并行(parallelism)"这句话毫无赶脚,那么请
李海彬
2018/03/19
2.3K0
JavaScript 是如何工作的🔥 🤖 [视觉解释]
JavaScript 是世界上最受欢迎和最讨厌的语言之一。它被爱,因为它是有效的。您只需学习 JavaScript 即可制作全栈应用程序。它也被讨厌,因为它以出乎意料和令人不安的方式行事,如果您不投入理解该语言,可能会让您讨厌它💔。 这篇博客将解释 JavaScript 如何在浏览器中执行代码,我们将通过动画 gif 来学习它😆。看完这篇博文,你离成为Rockstar开发者又近了一步🎸😎 执行上下文 “ JavaScript 中的一切都发生在一个执行上下文中。” 我希望每个人都记住这句话,因为它是必不可
玖柒的小窝
2021/09/12
2.6K0
JavaScript 是如何工作的🔥 🤖 [视觉解释]
TypeScript是如何工作的
TypeScript 是一门基于 JavaScript 拓展的语言,它是 JavaScript 的超集,并且给 JavaScript 添加了静态类型检查系统。TypeScript 能让我们在开发时发现程序中类型定义不一致的地方,及时消除隐藏的风险,大大增强了代码的可读性以及可维护性。相信大家对于如何在项目中使用 TypeScript 已经轻车熟路,本文就来探讨简单探讨一下 TypeScript 是如何工作的,以及有哪些工具帮助它实现了这个目标。
ConardLi
2021/09/29
5.5K0
TypeScript是如何工作的
HashMap是如何工作的
最简单形式的 hash,是一种在对任何变量/对象的属性应用任何公式/算法后, 为其分配唯一代码的方法。
java思维导图
2020/06/05
3.9K0
HashMap是如何工作的
Git 是如何工作的
Git 是一个分布式的版本控制系统,这意味着它使用多个本地存储库,包括一个集中式存储库和服务器,它在从前端工作中抽象出底层机制方面做得非常出色。虽然 Git 已经演变成一个成熟的版本控制管理系统,但这并不是作者最初的意图,但并不影响它成为最为世界上最为出色、优雅的工具之一。Git 的好处在于,你可以在整个职业生涯中都不知道 Git 内部是如何工作的,但你依然可以和它相处得很好。但当你了解了 Git 如何管理您的存储库将有助于打开你的思维方式,并让您更深入地了解 Git 。
政采云前端团队
2022/12/01
1.7K0
Git 是如何工作的
Haskell
这门语言在数学模型上有着很深的优势,虽然它有很多特性,让人很难接受,随着学习的深入,你才会发现这会多么有趣。
icepy
2019/06/24
8900
Kubernetes是如何工作
过去几年来,运行容器化应用程序的流行度呈爆炸式增长,这已经不是什么秘密了。能够通过代码提供应用程序的依赖项来迭代和发布应用程序是一个巨大的胜利。Gartner表示,到2022年,“超过75%的全球组织将在生产中运行容器化应用程序”。
CNCF
2019/12/04
1.4K0
Kubernetes是如何工作
Haskell doctest
一定要注意格式 第一行很重要,-- |这行没有就不是一个 test。 可以对比 >>> 的个数 和 terminal里的 Examples 个数确认是否自己的所有 test 都测试了
莫听穿林
2022/05/20
3210
Haskell doctest
DMAIC方法是如何工作的?
DMAIC方法通常用于驱动六西格玛项目,尽管该工具不限于六西格玛。这五个步骤必须按顺序进行,即定义、测量、分析、改进然后控制。作为最后“控制”步骤的一部分,我们可能会发现过程可以进一步改进,这样过程就可以重新开始,在这里可以定义新的改进,所以DMAIC是一个周期性的工具。每一步都有不同的动作。
用户9972271
2022/10/13
1.6K0
[ 物联网篇 ] - MQTT协议是如何工作的 ?
此外,它被设计为轻量级消息传递协议,它使用发布/订阅操作在客户端和服务器之间交换数据。此外,它的小尺寸,低功耗,最小化数据包和易于实现使该协议成为“机器到机器”或“物联网”世界的理想选择。
程序手艺人
2022/05/10
2.8K0
[ 物联网篇 ] -  MQTT协议是如何工作的 ?
理解dockerfile是如何工作的?
Step 0 : sudo docker pull baserepo:latest sudo docker run --name baserepo_bash01 -i -t baserepo:latest /bin/bash sudo docker ps -a b779269d5001
星哥玩云
2022/07/04
9760
云存储是如何工作的?
如今,企业越来越多地采用云存储选项,因为它们需要更多的容量、弹性容量以及更好的方式来管理存储成本。事实证明,越来越多的企业数据和云数据难以让IT部门单独使用他们的数据中心进行管理。
静一
2018/12/24
3.7K0
物联网是如何工作的?
这就是物联网在未来的工作方式。尽管这只是个玩笑,但未来大多数设备将会相互连接,一个超级决策框架会定义下一步的行动。
用户2605137
2022/04/12
1.9K0
物联网是如何工作的?
Ping 命令是如何工作的?
Ping 是一种常用的网络诊断工具,用于测试与目标服务器之间的连接质量和延迟。通过发送 ICMP(Internet Control Message Protocol)回显请求消息,Ping 命令可以测量往返时间(Round Trip Time,RTT)以及检测目标主机是否可达。
网络技术联盟站
2023/09/01
1.9K0
Ping 命令是如何工作的?
NAT穿透是如何工作的
在前一篇文章 How Tailscale Works 中, 我们已经用较长篇幅介绍了 Tailscale 是如何工作的。但其中并没有详细描述我们是 如何穿透 NAT 设备,从而实现终端设备直连的 —— 不管这些终端之间 有什么设备(防火墙、NAT 等),以及有多少设备。本文试图补足这一内容。
入门笔记
2022/06/03
2.3K0
NAT穿透是如何工作的
点击加载更多

相似问题

scanr是如何工作的?Haskell

23

haskell代码是如何工作的?

12

Haskell异常处理是如何工作的?

32

Haskell尾部递归是如何工作的?

52

F#是如何实现让rec的?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文