Haskell编程器的演变

2021-01-05 08:29:47

请参见Iavor Diatchki的页面“程序员的演变”,以了解“原著”(尽管他不是作者),以及有关该版本背后的故事,请参见下文。 fac =(\(n)->(如果((==)n 0)则1其他((** n(fac((-)n 1))))) (请阅读n + k模式是“ Haskell的令人作呕的一部分” [1],并加入了“ Ban n + k模式”-运动[2]) -使用文件夹模拟foldlfac n =文件夹(\ x g n-> g(x * n))id [1..n] 1 fac n =结果(对于下一个完成的init),其中init =(0,1)下一个(i,m)=(i + 1,m *(i + 1))完成(i,_)= i == n结果 (_,m)= mfor ind =直到dni facCps k 0 = k 1facCps k n = facCps(k。(n *))(n-1)fac = facCps id (喜欢打结;总是“虔诚”,他属于最小定点教堂[8])

y f = f(y f)fac = y(\ f n->如果(n == 0)则1否则n * f(n-1))

(避免变量,如果不是混淆的话;所有这一切只是一个阶段,尽管很少阻碍)

sfgx = fx(gx)kxy = xb fgx = f(gx)cfgx = fx gy f = f(yf)cond pfgx =如果px则fx else g xfac = y(b(cond((==)0)(k 1))(b(s(*))(cb pred)))

arb =()-"未定义"也是很好的RHS,&arb" :)listenc n =复制n arblistprj f =长度。 F 。 listenclistprod xs ys = [i(x,y)| x< -xs,y< -ys]其中i _ = arbfacl [] = listenc 1facl n @(_:pred)= listprod n(facl pred)fac = listprj facl

-动态类型的术语languagedata Term = Occ Var |使用Prim |亮整数|应用程式条款| Abs Var条款| Rec Var Termtype Var =字符串类型Prim =字符串-值的域,包括函数data Value = Num Integer |布尔布尔| Fun(值-> Value)实例Show Value,其中show(Num n)= show n show(Bool b)= show b show(Fun _)=" " prjFun(Fun f)= fprjFun _ =错误"错误的函数值" prjNum(Num n)= nprjNum _ =错误"错误的数值" prjBool(布尔b)= bprjBool _ =错误"错误的布尔值" binOp inj f = Fun(\ i->(Fun(\ j-> inj(f(prjNum i)(prjNum j)))))-将变量映射到值的环境类型Env = [(Var,Value)] getval x env = Just v的案例查找x env-> v什么都没->错误(" ++ x没有值)-基于环境的评估函数eval env(Occ x)= getval x enveval env(Use c)= getval c primseval env(Lit k)= Num keval env(App mn)= prjFun(eval env m)(eval env n)eval env(Abs xm)= Fun(\ v-> eval((x,v):env)m)eval env(Rec xm) = f其中f = eval((x,f):env)m-- a(固定的)" environment"语言原语的次数时间= binOp Num(*)减= binOp Num(-)等于= binOp Bool(==)cond = Fun(\ b-> Fun(\ x-> Fun(\ y-> if(prjBool b)然后x else y)))prims = [(" *"次),("-"减去),(" ==&#34 ;,equal),(" if&#34 ;, cond)]-表示阶乘和" wrapper"的术语。用于评估facTerm = Rec" f" (Abs" n"(App(App(App(使用" if")(App(App(使用" ==") n"))(Lit 0)))(Lit 1))(App(App(使用" *")(Occ" n"))(App(Occ& #34; f")(App(App(App(Use"-")(Occ" n"))(Lit 1))))))fac n = prjNum( eval [](App facTerm(Lit n)))

(他在课堂上这样做,他得到了琼斯的资助!在托马斯·哈格伦(Thomas Hallgren)的“功能依赖的乐趣” [7]之后)

-静态Peano构造函数和数字数据Zerodata Succ ntype一= Succ Zerotype 2 = Succ Onetype三= Succ Twotype四= Succ三-静态Peanoszero的动态代表= undefined :: Zeroone = undefined :: Onetwo = undefined :: Twothree = undefined :: Threefour =未定义:: ::四-另外,一个Prologclass添加abc | a b-> c在何处添加:: a-> b-> c实例添加零b binstance添加a c =>加(Succ a)b(Succ c)-乘法,一个Prologclass Mul a b c | a b-> c其中mul :: a-> b->实例Mul零b Zeroinstance(Mul a b c,Add b c d)=> Mul(Succ a)b d--阶乘,la Prologclass Fac a b | -> b其中fac :: a-> binstance Fac零一实例(Fac n k,Mul(Succ n)k m)= Fac(Succ n)m--尝试,用于" instance" (对不起):--:t fac 4

(研究生教育倾向于使人们摆脱对诸如基于硬件的整数的效率等琐事的关注)

-自然数,la Peanodata Nat =零| Succ Nat--迭代和一些应用程序zs零= ziter zs(Succ n)= s(iter zsn)加上n = iter n Succmult n =迭代器零(plus n)-基本递归primrec zs零= zprimrec zs(Succ n) = sn(primrec zsn)-阶乘= snd的两个版本。 iter(一个,一个)(\(a,b)->(Succ a,多个a b))fac' =原始1(mult Succ)-为方便和测试(例如" fac 5")int = iter 0(1+)实例Show Nat其中show = show。 int(零:一:二:三:四:五:_)=迭代成功零

-(咖喱,列表)折叠和应用折叠cn [] = nfold cn(x:xs)= cx(fold cn xs)prod = fold(*)1--(咖喱,基于布尔值的列表)展开并applicationunfold pfgx =如果px,则[] else fx:展开pfg(gx)downfrom =展开(== 0)id pred--同义,原样或" unfolded" (哎!对不起...)重新折叠c n p f g =折叠c n。展开grefold' c n p f g x =如果p x则否c(f x)(refold' c n p f g(g x))-阶乘的几种形式,所有(扩展地)等效fac = prod。 fromfac' =重新折叠(*)1(== 0)id predfac'' =重新折叠(*)1(== 0)id pred

(更喜欢希腊美食,避免使用辛辣的印度美食;灵感来自Lex Augusteijn的“排序形态” [3])

-(基于产品的列表)同构关系和应用程序cata(n,c)[] = ncata(n,c)(x:xs)= c(x,cata(n,c)xs)mult =非curry(* )prod = cata(1,mult)-(基于副产品的列表)变形,应用f =任一(const [])(cons。pair(id,ana f))。 fcons =非curry(:)downfrom = ana uncountuncount 0 =左()uncount n =右(n,n-1)-列表同胚的两个变体hylo f g = cata g。 ana fhylo' f(n,c)=任一个(const n)(c。pair(id,hylo' f(c,n)))。 fpair(f,g)(x,y)=(f x,g y)-阶乘的几个版本,全部(扩展地)等效fac = prod。 fromfac' = hylo uncount(1,多)fac'' = hylo'数不清(1,多)

-基于函子的显式类型递归新类型Mu f = Mu(f(Mu f))推导Showin x = Mu xout(Mu x)= x-催化和拟态,现在适用于*任意*(常规)基本函子cata phi = phi。 fmap(cata phi)。 outana psi = in。 fmap(ana psi)。 psi--自然数的基函数和数据类型,-使用咖喱消除运算符数据N b =零| Succ b推导Showinstance Functor N,其中fmap f = nelim零(Succ。 1 +))instance Show Nat,其中show = show。 intzero = in Zerosuck = in中。 Succ-原谅我的"法语" (前奏冲突)加n = cata(内里姆n吮吸)mult n =催化剂(内里姆零(plus n))-列表的基本函数和数据类型得出Showinstance Functor(L a)的缺点,其中fmap f = lelim Nil(\ ab-> Cons a(fb))lelim nc Nil = nlelim nc(Cons ab)= ca btype列表a = Mu(L a)-转换为内部列表,便利和应用list = cata(lelim [](:))实例显示a =>显示(清单a),其中show = show。 listprod = cata(李林(吸吮为零)多)upto = ana(内里姆·尼尔(diag(吸)).out)diag f x = f x xfac = prod。取决于

-具有函子和同构关系的显式类型递归新类型Mu f = In(f(Mu f))unIn(In x)= xcata phi = phi。 fmap(cata phi)。 unIn--自然数的基函数和数据类型,-使用局部定义的"消除器" data N c = Z |实例函子N其中fmap g Z = Z fmap g(S x)= S(gx)类型Nat = Mu Nzero = In Zsuck n = In(S n)add m = cata phi其中phi Z = m phi(S f )=吸取熔体m =催化剂phi其中phi Z =零phi(S f)=添加m f--显式乘积及其函数作用数据Prod ec =对c eoutl(对xy)= xoutr(对xy)= yfork fgx =配对(fx)(gx)实例函子(Prod e),其中fmap g =叉子(g。outl)outr-- comonads,类别为"相反" monadsclass的函子n => Comonad n其中extr :: n a->一个dupl :: n a-> n(n a)实例Comonad(Prod e),其中extr = outl dupl = fork id outr-广义的同构,同构和亚同构gcata ::(Functor f,Comonad n)=> (全部a.f(n a)-> n(f a))-> (f(n c)-> c)-> Mu f-> cgcata dist phi = extr。 cata(fmap phi。dist。fmap dupl)zygo chi = gcata(fork(fmap outl)(chi。fmap outr)para ::函子f => (f(Prod(Mu f)c)-> c)-> Mu f-> cpara = zygo In--阶乘,*难*!fac = para phi,其中phi Z =吸零phi(S(对fn))=多f(吸n)-为方便起见并测试int = cata phi其中phi Z = 0 phi(S f)= 1 + finstance Show(Mu N),其中show = show。整型

Warning: Can only detect less than 5000 characters