- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在他的文章“Why Functional Programming Matters”中,John Hughes 认为“懒惰评估可能是函数式程序员技能中最强大的模块化工具。”为此,他提供了如下示例:
假设您有两个函数,“infiniteLoop”和“terminationCondition”。您可以执行以下操作:
terminationCondition(infiniteLoop input)
infiniteLoop(input, terminationCondition)
最佳答案
是的,您可以使用传入的终止检查,但要实现这一点,请使用 infiniteLoop
的作者将不得不预见想要以这种条件终止循环的可能性,并将对终止条件的调用硬连接到它们的函数中。
而且即使特定条件可以作为函数传入,它的“形状”也是infiniteLoop
作者预先确定的。 .如果他们给我一个在每个元素上调用的终止条件“槽”,但我需要访问最后几个元素来检查某种收敛条件怎么办?也许对于一个简单的序列生成器,您可以提出“最通用的”终止条件类型,但是如何做到这一点并保持高效和易于使用并不明显。到目前为止,我是否重复将整个序列传递到终止条件中,以防它正在检查?我是否强制我的调用者将他们简单的终止条件包装在一个更复杂的包中,以便它们适合最通用的条件类型?
调用者当然必须确切地知道如何调用终止条件才能提供正确的条件。这可能相当依赖于这个特定的实现。如果他们切换到 infiniteLoop
的不同实现由另一个第三方编写,终止条件使用完全相同的设计的可能性有多大?带着懒惰infiniteLoop
,我可以删除任何应该产生相同序列的实现。
如果 infiniteLoop
不是一个简单的序列生成器,而是实际上生成了一个更复杂的无限数据结构,比如一棵树?如果树的所有分支都是独立递归生成的(想想像国际象棋这样的游戏的移动树),基于迄今为止生成的信息的各种条件,在不同深度切割不同的分支可能是有意义的。
如果原作者没有准备(无论是专门针对我的用例还是针对足够通用的用例类),我就不走运了。作者懒人infiniteLoop
可以顺其自然地写出来,让每个来电者懒洋洋地探索他们想要的东西;双方都不必了解对方太多。
此外,如果停止懒惰地探索无限输出的决定实际上与(并依赖于)调用者对该输出进行的计算交织在一起呢?再想想棋步树;我想探索树的一个分支多远很容易取决于我对我在树的其他分支中找到的最佳选择的评估。所以要么我做两次遍历和计算(一次在终止条件下返回一个标志告诉 infinteLoop
停止,然后再次使用有限输出,这样我才能真正得到我的结果),或者 infiniteLoop
的作者不仅要准备终止条件,还要准备返回输出的复杂函数(以便我可以将整个计算插入“终止条件”)。
在极端情况下,我可以探索输出并计算一些结果,将它们显示给用户并获得输入,然后继续探索数据结构(不根据用户的输入记忆 infiniteLoop
)。懒人原作者infiniteLoop
不需要知道我会想到做这样的事情,它仍然有效。如果我们通过类型系统强制执行纯度,那么使用传入的终止条件方法是不可能的,除非整个 infiniteLoop
如果终止条件需要,允许有副作用(比如通过给整个事物一个 monadic 接口(interface))。
简而言之,通过使用严格的 infiniteLoop
来获得与惰性求值相同的灵活性。使用高阶函数来控制它对于 infiniteLoop
的作者来说可能是大量额外的复杂性。及其调用者(除非暴露了各种更简单的包装器,并且其中之一与调用者的用例相匹配)。延迟评估可以让生产者和消费者几乎完全解耦,同时仍然让消费者能够控制生产者产生多少输出。你可以用这种方式做的一切你都可以用额外的函数参数来做,但是它需要生产者和消费者就控制功能如何工作的协议(protocol)达成基本一致;并且该协议(protocol)几乎总是专门针对手头的用例(将消费者和生产者捆绑在一起)或非常复杂以完全通用,以至于生产者和消费者都与该协议(protocol)相关联,而该协议(protocol)不太可能重新创建在别处,所以他们仍然联系在一起。
关于haskell - 惰性评估如何允许更大的模块化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41232285/
我正在 Java 上开发 Tic Tac Toe 游戏(eclipse)。在我的计算机上,我的对话框非常小。我一直在努力把它做得更大。我没有任何运气。我希望这里有人能引导我走向正确的方向。下面的代码是
出于辅助功能的目的,我需要使所有可滚动控件(列表、 ListView )的滚动条更宽,滚动条箭头更大。 如何从可滚动控件(例如:TListView)获取滚动条( handle )? 如何使滚动条和箭头
在我的 flutter 应用程序中,我想制作一个圆圈作为这样的背景: 最佳答案 问题主要是当屏幕处于横向时,除非它覆盖整个屏幕,否则你不能在那里放置一个圆圈。 ClipRect 还有另一种方法,如果这
如何在列表中找到最接近的值,这将返回更高的值?示例:[3,7,12,19] 的列表,如果我的值为 8,我如何获得最接近(更大)的值 12?我想要 dart 中的这个逻辑。 最佳答案 只需过滤 List
我是一个绝对的 HTML 和 javascript 初学者,我很确定,这真的很容易实现。我生成了以下 IFRAME: document.write("");Das aktuelle Wetter in
我有点知道为什么压缩 DES 文件时它更大,但谁能给我正确的理由或链接,我似乎找不到任何原因? 谢谢:) 最佳答案 经过适当加密的密文在压缩程序看来非常像一系列随机数。如果没有以明文形式出现的模式,压
假设我有两个表,其中一个(我们称之为 person)有一个名为 type 的字段,该字段存储链接到另一个表的整数(我们称之为types 带有一个名为 id 的字段。什么会更能提高性能? 一个更大的查询
我有一个ListView,它使用GridView来显示DataTable,并且当新行添加到DataTable
我在只出现在 Firefox 中的导航菜单上遇到了一个奇怪的问题(在 IE7、8、9、10 和 Chrome 中工作正常)。菜单上的链接显示为 block ,但它们在 Firefox 中计算得比任何其
我正在使用 javax.mail 并获取邮件收件箱文件夹中的邮件计数。使用https://outlook.office.com/ Folder folderInbox = store.getFolde
我想让地球字形图标更大,以便它覆盖页面的大部分(它是矢量图像)。它不在按钮或任何东西中;它只是一个人。有没有办法做到这一点? 最佳答案 增加 glyphicon 的 font-size
我定制了一个看起来像这样的搜索栏 问题是很难捕获 slider 。所以我想做的是增加拇指的碰撞箱以使其更容易。我尝试了一些东西,但总是弄乱了搜索栏的外观。我有什么想法可以做到这一点吗? 布局.xml
我有一个问题:下载到 Documents 文件夹中的音乐比以前长 2 倍,而且体积更大。比特率也有问题(增加/减少 2 倍)。图片保存得很好,但任何音乐都有问题。也许我需要手动设置音频比特率,但我还没
为什么 div 区域仍然比图像 css 大? /image/WHDU3.jpg 如何设置 div 区域以适合图像? 最佳答案 IMG - 是行内元素,因此
我发现在对文本文件进行排序时非常困惑。不同的算法/应用程序会产生不同的结果,例如,比较两个字符串 str1=";P" 和 str2="-_-" 仅供引用,这里给出了这些字符串中每个字符的 ASCII:
我有一个应用程序已经在 Play 商店中存在多年,我刚刚构建了一个更新。该更新利用了 numberpicker,它的 min-sdk 为 11,并且在 v4 支持库中不适用。我倾向于发布我的新版本并在
你能告诉我如何强制 CSS 使 line-through 属性比元素 width 宽吗? 例如 50 结果看起来像现在如何使线条比元素更宽更明显? 赞 最佳答案 你可以使用 ,这是一种很俗气的方式 &
我想制作一个比应有的大得多的虚拟 Win32 EXE 文件。所以默认情况下,样板 Win32 EXE 文件为 80 KB。我想要一个 5 MB 的空间来测试其他一些实用程序。 第一个想法是添加资源,但
我有一个 UIView,里面有一个更大的 UIImageView。有没有办法隐藏超出 View 大小的内容? CGRect baseFrame = CGRectMake(100, 100, 300,
当我改变缓冲区的大小时,我得到了无法从 BufferedReader 解释的奇怪结果。 我曾强烈期望性能会随着缓冲区大小的增加而逐渐增加, yield 递减设置相当快,此后性能或多或少会持平。但看起来
我是一名优秀的程序员,十分优秀!