这一章里这样说道:
如果一个函数是作用在其他函数上的画,那么它就是高阶的。(或称为 算子,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