博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift 之惰性求值
阅读量:6676 次
发布时间:2019-06-25

本文共 2152 字,大约阅读时间需要 7 分钟。

Swift 之惰性求值

Haskell 中的函数有一个特性

函数的返回可能是一个块(一个被延迟计算的表达式)

从而引出一个概念 惰性求值

isOdd n = mod n 2 == 1

下面有段

在使用严格求值的语言里,函数的参数总是在应用函数之前被求值。以 isOdd 为例子:子表达式 (1 + 2)会首先被求值,得出结果 3 。接着,将 3 绑定到变量 n ,应用到函数 isOdd 。最后, mod 3 2 返回 1 ,而 1 == 1 返回 True 。Haskell 使用了另外一种求值方式 —— 非严格求值。在这种情况下,求值 isOdd (1 + 2) 并不会即刻使得子表达式 1 + 2 被求值为 3 ,相反,编译器做出了一个“承诺”,说,“当真正有需要的时候,我有办法计算出 isOdd (1 + 2) 的值”。

惰性求值的优点

简单理解惰性求值: 在使用惰性计算时,表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值。

  • 可以创建无限序列数据类型, 比如无穷大,由于字节的限制,很多语言并不能描述出无穷大
  • 减少存储空间, 在要求值的时候才会发生计算。 这个跟 lazy 属性一样的作用
  • 减少计算量, 例如,寻找数组中符合条件的某个值

swift 默认严格求值, 也提供了相关的惰性求值的机制

let array = [1,2,4,5,3,7]let selement = array.map({$0 * 2})[3]let element = array.lazy.map({$0 * 2 })[3]print("\(selement) -- \(element)")

上面代码中, 计算出 selement 花了 7 次, 计算 element 花了 2

  • 对于 7:将 array 每个元素分别取出 * 2,然后在这些数据中取出第4个元素, 6+1=7
  • 对于 2:因为是惰性求值,会先从 array 取出第4个元素, 然后 * 2 , 1+1 = 2

lazy 到底为何物?

extension Array {    public var lazy: LazyRandomAccessCollection
> { get }}

LazyRandomAccessCollection Conforms To

LazyCollectionProtocol

LazyCollectionProtocol Conforms To

LazySequenceProtocol

构建无穷大序列 (swift4)

enum Stream
{ case empty case cons(()->T, ()-> Stream
)}extension Stream { var empty: Stream
{ return .empty } var tail: Stream
{ switch self { case .empty: return .empty case let .cons(_, tail): return tail() } } var toArray: [T] { switch self { case .empty: return [] case let .cons(h, t): return [h()] + t().toArray } } func take(n: Int) -> Stream
{ if n == 0 { return empty } else { switch self { case .empty: return .empty case let .cons(h, t): return Stream.cons(h, {t().take(n: n-1)}) } } }}func onses() -> Stream
{ return Stream
.cons({1}, {onses()})}print(onses().take(n: 5).toArray)

当然更多博客请移步到

参考

转载于:https://www.cnblogs.com/Ohero/p/8004681.html

你可能感兴趣的文章
查看 docker 容器使用的资源
查看>>
Jedis的配置和优化
查看>>
layui + 阿里巴巴iconfont图标库导入
查看>>
2017总结一
查看>>
MySQL中TIMESTAMPDIFF和TIMESTAMPADD函数的用法
查看>>
Power Designer数据库建模工具,正向、逆向工程
查看>>
Libevent学习-02:搭建CentOS下的开发环境
查看>>
yum install 与 yum groupinstall 的区别
查看>>
Go基础系列:读取标准输入(一)
查看>>
PHP协程入门详解
查看>>
Java_Reflect_1
查看>>
HTML中的<table>标签及其子元素标签,JS中DOM对<table>的操作
查看>>
在linux中执行wget命令提示 -bash: wget: command not found 解决方法
查看>>
MobPush推送证书制作
查看>>
springmvc源码解析之配置加载ContextLoadListener
查看>>
网站安全防护工作
查看>>
如何判断一个以太坊地址是不是合约?
查看>>
逆袭!? 期待下一个“BCH”出现
查看>>
opengl es3.0学习篇五:图元装配跟光栅化
查看>>
Qt之添加菜单项&状态栏
查看>>