最近在看R,不过还是习惯性地对语言特性感兴趣。R也可以操作代码本身,有一个类似lisp 宏的系统。不过他更像IO language,利用延迟计算+代码操作,可以完成类似lisp宏的功能,定义新的“语法结构”。一个例子:我们实现一种机制可以部分地给一个函数的参数来得到一个新的函数(柯瑞化)。比如我们有...
分类:
编程语言 时间:
2015-04-07 17:11:37
阅读次数:
212
Oracle在Java8 中开始正式引入lambda表达式,虽然迟来了一些,但是作为Java开发者我们还是很兴奋的。在进入正式的学习前,我们现在体验区体验一下lambda的魅力所在。...
分类:
编程语言 时间:
2015-02-12 12:27:50
阅读次数:
211
12.7.3 使用计算表达式进行重构
在前一章,我们讨论过重构函数式程序的方法,最后一个主题是延迟性,它变改代码的执行方式,而不影响程序的结果。从某种意义上讲,添加延迟性也可看作是一种重构技术;计算表达式的类似之处在于,增加额外的代码,但不改变核心意思。
提示
在计算表达式和延迟性之间有密切的关系,使用 Lazy 计算类型,创建能够把代码转换成延迟计算的计算表达式,是有可...
分类:
其他好文 时间:
2015-02-02 15:56:47
阅读次数:
190
11.4.2.2 实现用户界面
现在,我们已经有了关于处理照片所需要的所有数据,下面就可以添加简单的图形用户界面,使用 Windows 窗体。在清单 11.22 中,我们将创建两个控件以显示数据,代码显示选定的照片。
清单 11.22 添加照片浏览器的用户界面 (F#)
open System
open System.Windows.Forms
let main =...
分类:
其他好文 时间:
2015-01-16 14:41:35
阅读次数:
184
11.4.2.1 使用延迟值进行缓存
应用程序中最重要的部分是,应用程序启动时执行的代码,找到指定目录中的所有文件,并创建有关每个文件信息的数组;这些信息包含文件名,和为了展示调整大小而计算的延迟值。清单 11.21 是为此而创建的数据结构。
清单 11.21 创建有关图片信息的集合 (F#)
open System.IO
open System.Drawing
t...
分类:
其他好文 时间:
2015-01-16 11:20:14
阅读次数:
132
11.4.1 无穷列表
这一节的标题听起来可能有点奇怪(或疯狂),所以,需要解释一下。函数式列表是我们经常使用的一种数据结构。如果我们想要表示逻辑上无穷的列表,例如,所有质数的列表。当然,我们不可能用到所有的数字,只是像这样使用数据结构,而不必考虑长度。如果列表是无穷的,我们就能够访问尽可能多的数字,只要我们需要。
除了数学上的挑战以外,同样的概念在许多主流编程中也是有用的。当我们在第四...
分类:
其他好文 时间:
2015-01-16 10:11:07
阅读次数:
164
11.4.2 在照片浏览器中缓存值
下面的示例,我们将写一个应用程序,找出指定文件夹中所有照片,并以列表形式显示;当用户选择一张照片,应用程序调整大小,在窗口中显示。(为了简便起见,我们不会允许用户调整窗口大小)。当我们展示(draw)照片时,将需要调整其大小以适合屏幕,然后,调整后的尺寸显示图像。
很明显,在应用程序启动时,我们不想调整所有照片的大小:对于照片很多的情况,需要花费大量的...
分类:
其他好文 时间:
2015-01-16 10:09:12
阅读次数:
148
11.4 实用延迟值
如果我们有一系列计算,可能要花很长时间,并且只在需要时才计算这个(些)值,这时,延迟值就很有用了。在这种情况下,可以得益于缓存,我们在上一节已经用 C# 实现过,把延迟值作为缓存,在需要时才填充。
延迟值的另一个重要用途,是表达一些概念时,很难以其他方式编程。我们将先Haskell 提供的几个例子,讨论有关延迟值的实际使用;Haskell 在每一处都使用延迟计算,这...
分类:
其他好文 时间:
2015-01-15 12:57:19
阅读次数:
169
11.3.5 为 C# 实现延迟值
在 11.3.3 节,我们使用函数来表示 C# 中的延迟计算。我们刚才在 F# 中探讨了Lazy 类型,它为计算过的值,添加了缓存功能。从Visual Studio 2010 开始,在核心的 .NET 库下的System.Lazy 就有了这种类型,因此,我们不必自己实现。
清单 11.18 是简化的 Lazy 类。代码在许多方面做了简化,它不是线程安...
11.3.4 F# 中的延迟值
F# 中的延迟值(lazy value)是通过延迟计算表示的,就是说,只有在值需要时才进行计算。在上一节,我们用 C# 函数实现了类似的功能,而延迟值自动只计算一次,并能记住结果。
探索此功能的最佳方法是在 F# Interactive 中进行。清单 11.16 用脚本进行了演示。
[
清单编号的错误再次出现了.
]
清单 11.16 介绍延迟值 ...
分类:
其他好文 时间:
2015-01-14 16:57:30
阅读次数:
220