ML函数式编程程序设计笔记-第五章 函数和无穷数据

这一章里这样说道:
如果一个函数是作用在其他函数上的画,那么它就是高阶的。(或称为 算子,functional),例如算子map将一个函数应用到表中的每个元素上,由此建立一个新表。
算子可以用来构造语法分析器!(第9章)

无穷表,它的元素在需要的时候才会进行求值,也可以用过把函数作为数据来实现。一个惰性表的表尾是一个函数,当这个函数被调用时会产生另一个惰性表。惰性表可以是无限长的,而它的任何有限数目的元素都是可以求值的。

惰性求值!!

先说说无穷表。
无穷表在传统上称为”流“stream,在这本书里称为序列 sequence。序列或者是空的,或者是包含头和尾的。空序列是Nil,而非空序列是Cons(x,xf),x是头,xf是计算尾的函数。

注意,类似Cons(x,E)并不是惰性求值,想要延迟对E求值,直接写
Cons(x,fn()=>E)来代替Cons(x,E)
这样就可以实现无限和惰性啦!

当然,函数取值的方式似乎也要有所变化,要包含apply这个过程的作用:
比如,拿take举例。take(xq,n)取序列xq的前n个元素作为表返回。
fun take (xq,0) =[]
|take(Nil,n) =raise Subscript
|take(Cons(x,xf),n) =x::take(xf(),n-1)

比如,拿squares举例
fun squares Nil:int seq=Nil
squares (Cons(x,xf))=Cons(x*x ,fn()=>square(xf()))

再比如,拿add举例:
fun add (Cons(x,xf),Cons(y,yf))=Cons( x+y,fn()=> add(xf(),yf()) )

无穷表可以链接消费者和生产者,使得项目仅在被消费时才产生。

这和continuation-passing style有什么关系?

https://zhuanlan.zhihu.com/p/34668011

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值