流上压缩函数的表示Graham Hutton和Mauro Jaskelioff,2011年10月流:>数据流a=Cons a(流a)>衍生节目>>shead::流a->a>shead(Cons x xs)=x>>stail::流a->流a>stail(Cons x xs)=xs>>smap::(a->b)->流a->b>smap f(Cons x xs)=Cons(f x)(smap f xs)>>smap2::(a->b->c)->流a->流b->流c>smap2 f(缺点x缺点)>(Cons y ys)=Cons(f x y)(smap2 f xs ys)>>smerge::流a->Stream a->Streama>smerge(Cons x xs)ys=Cons x(smerge ys xs)> >sindex::流a->Int->a>正弦指数(Cons x xs)0=x>正弦指数(Cons x xs)(n+1)=正弦指数xs n>>赌注::Int->Stream a->[a]>桩号0_=[]>标桩(n+1)(Cons x xs)=x:标桩n xs示例流:>个::流Int>ones=缺点1个ones>>nats::流Int>nats=Cons 0(smap(+1)nats)>>fibs::流整数>fibs=Cons 0(Cons 1(smap2(+)fibs(stail fibs))>>零::流Int>zeros=Cons 0(最大零(stail zeros))生成函数:>类型Gen a b=[a]->b>>gen::gen a b->(流a->流b)>gen g~(Cons x xs)=Cons(g[])(gen(g.(x:))xs)> >代表::(流a->流b)->生成a b>代表f[]=shead(f any_a)>rep f(x:xs)=代表(stail.f.Cons x)xs> >any_a::流>any_a=any_a固定点:>修复::(a->a)->a>修正f=设x=x中的f x>>gfix::Gen a a->流>gfix g=修复(gen g)生成函数示例:>过去::Gen Int Int>gones[]=1>gones xs=最后一个xs>>gones’::Gen Int Int>gones的xs=1>>蚊虫::Gen Int Int>gnats[]=0>gnats xs=最后一个xs+1>>蚊虫'::Gen Int Int>gnats'xs=长度xs>>gfibs::Gen整数整数>gfibs[]=0>gfibs[x]=1>gfibs xs=最后一个(init xs)+最后一个xs>>gfibs'::Gen整数>gfibs'xs=案例长度xs> 0 -> 0>1->1>n->xs!!(n-2)+xs!!(n-1)>>gzero::Gen Int Int>gzero[]=0>gzero xs=xs!!(长度xs`div`2)示例流:>myones::流Int>myones=gfix去势>>myones'::流Int>myones'=gfix gones'> >mynats::流Int>mynats=gfix蚊虫> >mynats::流Int>mynats'=gfix gnats'>>myfibs::流整数>myfibs=gfix gfibs>>myfibs'::流整数>myfibs’=gfix gfibs’>>myzeros::流Int>myzeros=gfix gzeros逆转历史:>rgen::生成a b->(流a->流b)>rgen g=rgen g[]> >rgen'::Gen a b->[a]->(流a->流b)>rgen'gys~(Cons x xs)=Cons(gys)(rgen'g(x:ys)xs)固定点:>rgfix::Gen a->流>rgfix g=修复(rgen g)生成具有反向历史的函数的示例:>rgones::生成Int Int>rgones[]=1>rgones(x:xs)=x>>rgnats::Gen Int Int>rgnats[]=0>rgnats(x:xs)=x+1>>rgfibs::Gen整数整数>rgfibs[]=0>rgfibs[x]=1>rgfibs(x:y:zs)=y+x>>rgzeros::Gen Int Int>rgzeros[]=0>rgzeros xs=xs!!((长度xs-1)`div`2)示例流:>rones::流Int>rones=rgfix rgones>>rnats::流Int>rnats=rgfix rgnats>>rfibs::流整数>rfibs=rgfix rgfibs>>rzero::流Int>rzeros=rgfix rgzeros生成树:>数据树a b=节点b(a->树a b)>>标签::树a b->b>标签(节点y f)=y>>分支::树a b->(a->树a b)>分支(节点y f)=f转换函数:>gen'::树a b->gen a b>gen'(节点y f)[]=y>gen'(节点y f)(x:xs)=gen'(f x)xs>>代表::Gen a b->树a b>rep'g=节点(g[])(\x->rep'(g.(x:))生成树的展开操作符:>类型Coalg c a b=(c->b,c->a->c)> >展开::Coalg c a b->c->Tree a b>展开(h,t)z=节点(h z)(\x->展开(h、t)(t z x))生成函数:>生成::Coalg c a b->c->(流a->流b)>generate(h,t)z~(Cons x xs)=Cons(hz)(生成(h,t)(tz x)xs)固定点:>cfix::Coalg c a a->c->流>cfix(h,t)z=修复(生成(h,t)z)一连串的:>圆锥体::流Int>锥体=cfix(音调)1>>手机::Int->Int>珩磨x=x>>音调::Int->Int->Int>音调x _=x自然数:>cnats::流Int>cnats=cfix(hnats,tnats)0>>hnats::Int->Int>hnats x=x>>tnats::Int->Int->Int>tnats x _=x+1斐波那契数列:>cfibs::流整数>cfibs=cfix(hfibs,tfibs)(0,1)>>hfibs::(整数,整数)->整数>hfibs(x,y)=x>>tfibs::(整数,整数)->整数->(整数,整型)>tfibs(x,y)_=(y,x+y)通过合并的零流:>czeros::流Int>czeros=cfix(hzeros,tzeros)([],-1)>>hzeros::([Int],Int)->Int>hzeros([],_)=0>hzeros(xs,n)=xs!!(n `div`2)>>tzeros::([Int],Int)->Int->([Int],Int)>tzeros(xs,n)x=(x:xs,n+1)从生成树生成流:>fromtree::Tree a->流>fromtree=cfix(标签,分支)从生成函数生成流:>fromgen::Gen a->流>fromgen=cfix(hgen,tgen)>>hgen::生成a b->b>hgen g=g[]>>tgen::a b世代->a->a b世代>tgen g x=克。(x:)从具有反向历史的生成函数生成流:>fromrgen::(Gen a a,[a])->流>fromrgen=cfix(hrgen,trgen)>>hr发电机::(发电机a b,[a])->b>hrgen(g,xs)=g xs>>trgen::(a代b,[a])->a->(a代b,[a]])>trgen(g,xs)x=(g,x:xs)