陆陆续续接触λ演算,Haskell这类Fp也有一年多了,此文算是给自己填坑小结吧,也是为了让更多人看到λ演算大世界的美妙。
fp话题有点大,定题为 Haskell大世界 好了。
不动点,这个问题我当时刚看Haskell免费电子书,发现实际上自己认识不到位呀。看书很多时候要有一定的基础去看才能触类旁通,举一反三,很多名字不一样的东西其实就是一个东西,一个思路。一个比较具体的例子就是,学完C看张淞的书,发现就像囫囵吞枣,学完JAVA再看,深入理解了很多,在期间接触很多相关的东西之后再看,笔记已经在书页挤得满满的了。很多书都是,在新认知层面再看,发现很多以前自己没有发现的认识。张淞的书第一版我最珍重的是他章末和扉页最后一段那些参考文章的推荐和介绍,感觉这才是他遗留在沙滩上的脚印,适合当初我的水平接触,现在很官方正式的引文倒是让我有点不知道这么多引文不知道点那个的迷糊。
haskell大型项目.其实近期内我相关思考,精炼的主要观点就在这个回答里面,太长不看的人士,可以看这个回答。
水平有限,不喜请喷,欢迎交流.
认识一个企业后端工作的的程序员,问到函数式编程
他说:“没什么,就是lambda表达式代码写成一行的一些语法特点,常见,很多语言都有,没什么稀奇的。”
我犹豫了下没问,心想,这,只是表面吧?最底层用lambda演算实现计算机演算,从最基本的原理上就不同于改进图灵机的冯诺依曼体系,church的图灵机本质上就是不一样的东西吧?
维基:
可图灵指在可计算性理论中,编程语言或任意其他的逻辑系统如具有等用于通用图灵机的计算能力。换言之,此系统可与通用图灵机互相模拟。这个词源于引入图灵机概念的数学家艾伦·图灵(Alan Turing)。虽然图灵机会受到存储能力的物理限制,图灵完全性通常指具有无限存储能力的通用物理机器或编程语言==可实现死循环,区分物理机不能实现无限内存。
同样解决希尔伯特的数学可解性问题,证明了逻辑上等价,二律背反。如果在同一系统能够被不同理论描述,不同理论结论的自洽和相互转换等价性不是显然的吗?
皮亚诺算术,递归。“我们不能定义数字,因为那更加难以理解”。一个大佬回答我的关于形式化量词如何用代码实现的问题的时候,问我,“你如何不用递归来定义无穷集?”我愣住了,对哟。
观点:
图灵完备参见这个相关链接
量子力学里面的正交完备基,机器A和图灵机都可以归一化为人类在纸上能够进行的计算一切可解问题图灵机等价于lambda演算无限内存.
完备性的解释。包括:代数闭域(algebraically closed field)、紧化(compactification)或哥德尔不完备定理。主要还是数理逻辑的内容。
根据图灵假说, 任何可计算的都可以用图灵机表达, 也就是说目前没有比Turing Machine更强大的系统, 所以可以粗略地说如果L图灵完备, 则 L = Turing Machine. 因此"两种语言都是图灵完备, 所以这种的程序另一种至少也能写" 是可以这么说的, 因为两者的表达能力都等于图灵机.
Oracle Machine比Turing Machine更强。不过物理上能造出的最强的机器可能就是图灵机了……
我理解中的Lambda是改进图灵机的冯诺依曼体系等价理论体系,更加基础的抽象。
感觉现在计算机实现运算的基石是组成原理第六章,那个变量里面计算倒腾01变量(邓俊辉的数据结构课前几节还有一个形象的TuringMechine),然后church的底层实现演算是lambda演算,具体实现过程看面向小白的lambda演算(这文章跟着用白纸手算一遍很受启发),然后我推荐看这个Github项目中文lambda演算的介绍,包括Haskell的翻译。,看完,跟着演算一边PDF很有感觉。
然后在已经建好的大楼上添砖加瓦,(造轮子的人才应该被人尊敬,而不是倒卖知识自己还没学明白的那些靠资源信息不对等挣钱的),我们需要实现的是添砖加瓦,《函数式编程入门》张凇的书应用实例多,有思考,启发性强,让我读了很多遍,很有启发,最开眼的是他把haskell数学公式形式和代码完美结合,展示出来一种很自然的感觉。《魔力haskell》这本书我看的比较晚,但是看到后期果然发现不同书籍之间有互补的作用,函子->应用函子->单子,我感觉韩冬老师的书讲的太好了,虽然有些时候半页看半天才看懂(那题用flodl实现flodr的)。
跳出冯诺依曼的魔咒,haskell函数式编程也是很高明的抽象。
简单来说,我感觉λ演算就是另一种更基础的抽象,生活中数学里各种“操作”的抽象就是lambda演算代入,模式匹配就像是“选择判断”的抽象,不动点是“重复操作”的抽象,而递归仅仅是“重复+判断出递归基”罢了,循环不过是尾递归系统栈改成用户栈调用优化罢了。
这些同构的系统就能证明相互性,就能互相转换,不同理论体系描述世界的方式不同,也就殊途同归了。就像 定理之间的组合也会存在“最基本的那么几条公理”能张成整个“理论空间”,比如欧几里几何。或者说命题逻辑里面的“联结词完备集”,{非,或/与}和{与非联结词}是可以转换的,再如量子力学九种形式…
无穷集如果是递归定义的,这说明能用归纳法去证明其正确性,而和自然数同构的很多系统也能用N的方法来研究就显而易见了,这大概就是 数学之美 吧。
借用Mooc教授讲编译原理的时候说的话,大概意思是:
新语言最贵的是培训,几个人弄明白内核就够了,新语言是因为旧社区不能推倒重来,干脆换个名字叫新语言。
每种语言只是自己适用场合不一样,知识轮子生态不一样而已。
C系语言都差不多,很多语言我称之为打包C,重点是生态,知识轮子和针对性,便捷性。
Api程序员的调侃其实也说明了,我们就是不断打包已有知识的基础上,减轻脑力复杂度,进而研究更加深入问题的,但是黑箱子可以不代表可以永远“不求甚解”,必须懂构造思路逻辑方法或者基础自学操作常识性认识,需要“求甚解”的时候要有能快速学会的能力。
函数式系语言也一样,haskell纯函数式,对我来说比较有特殊意义。
复制粘贴程序员的笑话说明一点,人力优势穷,计算机知识帮助我们拓展思路能力辅助器官,好处是:光速大内存精准记忆和可重复性强。
编程语言说到底只是人机交互的桥梁,文学编程mma/jupyter就很有感觉,但我感觉lambda演算上层建筑fp能给你更加好的体验。
这些fp代码长着就像算法流程说明书,只不过是他恰好能运行罢了。
函数是第一公民(数字,网络,路图,树木,lambda表达式,匿名函数,函子,通用文件manod…万物皆函数的角度)
类型系统λ学习笔记参考知乎专栏(黑洞)
千里冰封欧林猫他们在干的,建议围观。
文章
论文
相关问题搜索引流
wiki上很多相关专题都值得看。
论文检索,还是去专业的地方吧。
个人觉得,张淞的书看着就像是论文学习笔记,特别是第二版。
TBH, Haskell 也快奔三到头, 在上面发表的论文真多如牛毛, 如果没有一个方向或者目的, 列举出来的意义也不是特别大. 下面按方向随便大概列举一下:
Meta
A History of Haskell: Being Lazy With Class - 到目前为止 Haskell 前半生的故事, 虽然后期 GHC 的实现翻天覆地, 但是还是可以了解到 Haskell 设计的初衷和其中一些概念(例如 Monad)引入的历史, 还有唐凤用实现 Perl6 当 TAPL 练习题干进 Haskell 2010 标准作者之一的故事之类的. 以及对 为什么 Haskell 始终没法流行呢?
Confessions of a Used Programming Language Salesman - Getting the Masses Hooked on Haskell, Haskell 98 标准作者之一 Erik Meijer 把 Haskell 的 idea 到各个语言"发扬光大"过程中的心路历程, 虽然后面搞了 rx, Dart async spec 这种事情没记录进去.Haskell 实现
这个真不是我随便就可以列完整的列表, 而且分支也很多, 我来整个 meta-list:
A Haskell Implementation Reading List
ReadingList - GHC
tweag/asterius
Haskell 实现相关的 reading list
以及无脑推荐两个 Simon 的所有 paper类型系统
看 Richard A. Eisenberg 的 PhD 论文 DEPENDENT TYPES IN HASKELL: THEORY AND PRACTICE, 找参考文献看应该会比较好。
语言抽象/模式
Monad 的推荐看 Philip Wadler 的 - 有没有对Haskell中理解monad比较好的代码例子?
Applicative: Idioms: applicative programming with effects
其他的可以在 Typeclassopedia - HaskellWiki 找, Profunctor 最近的还没有。
Fun with Semirings 这种玩代数结构也挺好玩的。
Parser Combinator, 还是推荐 Graham Hutton, Erik Meijer, 复杂的都要自己看实现. 找更原始的可以看 Parsing Techniques 第二版的参考文献.
Recursion Schemes, Paper 都挺不好看的, 看 Adventures in Uncertainty 的介绍好多了, 其他可以到 passy/awesome-recursion-schemes问题解决方案
估计这个Functional Pearls 密集区了
Expression Problem: Data types a la carte
Oleg Kiselyov 问题终结者: Extensible Effects 系列, Implicit Configurations, Reflection without Remorsesuccinct data structure 得看 ekmett 的 talk 和库,ekmett 所以库相关的都推荐
越列越多, 都看得过来吗?编辑于 2019-03-09
感觉Haskell更多地是作为研究性语言存在的,有哪些公司把Haskell作为开发语言?
https://www.zhihu.com/question/36325022/answer/67674150
https://www.zhihu.com/question/20246934/answer/15262041
https://www.zhihu.com/question/54095611/answer/137873645
https://www.zhihu.com/question/41139361/answer/90430564
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
看下A History of Haskell , Every Language Fixes Something, Haskell的诞生本身就是出于研究目的的, 并没有想去解决工业界的什么痛点或者难点(如果有软件危机也不是单靠换个语言来解决的), 而且Haskell跟流行的语言一点都不像.
老实说到上个世纪或者GHC没有主导Haskell实现之前(严重地说可以到2010年), Haskell的生产力(不是语言表达力, 主要是库), 培训成本跟主流的语言还是有不少差距, Real World Haskell算是个里程碑, 然而现在也已经过时.
主流语言的变化也逐渐变快, C++/Java也吸收了很多函数式编程语言里的元素, Rust也把之前不少PLT研究积累的成果工业化. 虽然Haskell没有进入主流但是也影响了不少其他语言, 像Java, Swift里的Option, Elixir里的with都脱胎于Haskell的Maybe Monad, 还有coffeescript之类的语言.
然而Haskell里面各种概念的演变发展是一般的程序员没法想象的, 要让所有程序员理解Monad的怕是要写无数个"深入浅出"的教程, 以及各种以"如何理解", "怎么用简单的语言"开头的知乎问题还有下面无数不同观点的答案, 何况还有free monad, comonad, functor, applicative… 各种东西.
至于一些"政治文化"因素Philip Wadler写过些文章来探讨:
Wadler: Functional Programming
P.S 还是有公司用Haskell的:
Case Studies
FP Complete · GitHub
Zalora · GitHub
Galois, Inc. · GitHub
Silk · GitHub ;;;
Soostone Inc · GitHub
Helium Systems, Inc. · GitHub
facebook/Haxl · GitHub ;;;
Well-Typed LLP · GitHub
Tweag I/O · GitHub
Anchor · GitHub
Tsuru Capital · GitHub
biegunka · GitHub
capital-match · GitHub
Ambiata · GitHub
Scrive · GitHub
Haskell Blockchain Company, BlockApps, Partners With Microsoft BlockApps · GitHub
Haskell in Production at Wagon
Haskell in industry
我甚至曾经冲动地认为Fp是C系语言的超集,是上游的更原始普适有效的抽象,才能更方便直接利用做好的代码知识轮子。
C用内存作为装数据的没标签透明杯子抽象方式,haskell用monad装数据,但是有对应的管道类似的操作传来传去很费劲。
处理副作用问题的时候不太方便,但(存数+类型标签)的盒子抽象,精美的类型系统能自由安全处理,推导数据类型的正确性和安全性。
C系语言类型解析形式是int foo=1;告诉编译器记住foo地址的二进制串解释方式是int的字符编码约定。类型转换,改数据就直接弄foo位置存储的bite位,这会带来"价值百万的NULL错误"问题或者内存泄漏之类的。haskell则是要新绑定一个(值+值的类型标签)盒子,安全的类型转换。这样也有缺点,打印出中间结果比较费劲,函数调用深度debug比较麻烦(不过写的时候能调通的代码基本没什么bug)。
惰性求值有它的好处,从《Why Functional Programming Matters》中知晓惰性计算可以带来哪些好处。但是不但给复杂度分析,算法分析带来困惑,内存处理空间分析也很难想清楚,《魔力haskell》提到“任务盒堆积问题”。
thunk任务盒子堆积要seq,如果只想一些中间变量有用保存结果,没必要保存中间变量,飞速发展的haskell,好像已经有办法了,记得好像大概可能也许看过?Dynamic动态类型?unsafeCoerce强制类型转换?具体忘了。
参数度多种类型的多态也能做,实现函数重载,java可以接口,haskell可以“类型类”,kind*。
lambda表达式是《C++Primer》说的是一种可调用对象callable object的抽象,很适合函数调用函数,curry柯里化把多元函数看成一元函数串起来,实现任意参数(lift2A升格也行,但是任意函数升格还是不如串起来运行时决定)。
模式匹配处处都是,其实模式匹配是生活中“各种抽象的情况下对应分类处理方式”的抽象,haskell处处可见,可以看成C系语言的选择抽象,如果看成循环判断出口的话,可以定义出循环结束,当然也可以定义出不动点函数重复计算的出口,递归调用的结束递归基。
元编程,泛型等haskell都很优雅地完成任务,值得一提的是纯函数在并行处理的时候的优越性,学过操作系统的时候一定曾经被处理流水的各种算法弄蒙逼了吧,这里有更加安全的STM,更好的事务管理,更好的并行并发。
haskell和数学主流描述世界的抽象描述方式极其逼近,我想类比
“Mathematic is more in need of good notations than of new therems.------A.Turing ”,
一种更高明的编程方式比新的源码库包装起来的代码知识轮子更重要,
“CS is more in need of good Abstract description pattern than of new code library”。
描述世界运作的规律(一可以用各种数学方言来描述,各种数学理论公式定理),既可以用这种编程语言实现,也可以用那种编程语言实现,但是不变的是写在抽象符号表示的那些“数学语言”。
就像计算机可以像差分机一样用机械结构实现,用电子电路实现,甚至用量子物理等,各有优点,尽管长得很不一样。
但是,图灵机自动机上下文无关那些《计算机理论》类似的符号化的抽象规律描述的本质规律,才是真正的科学指导纲领。
任何的递归都可以用栈来替换实现。递归可以用不动点定义,不动点是重复的抽象,递归已经包括了重复结束条件的抽象。
栈能把递归实现非递归模式,或者说,递归是系统栈调用,效率不高因为《操作系统》保存环境恢复现场多余信息,用户自己设计一个栈只存储用得上的值,所以用户栈定义的非递归效率高。
一些编译器会把尾递归优化为循环。
而越抽象,越放之四海皆可用,越抽象也越难直接写出来且没有bug,要有很强的造轮子能力。
ADT更加抽象更加泛型,更加数学,可用范围更广!
抽象的魅力!
更接近大脑思考!
**模块化程序设计,软件工程,项目管理,不断降低复杂度,把已经写好的难题麻烦包装起来。
**
学习学的是造轮子的思路想法启发,知识创造的来龙去脉从零建立来自己心中的知识高楼,而不是背默下来琐碎的知识点,舍本逐末。
Haskell没有JAVA那么蹩脚,C语言基石,C++拿来主义什么都往上加丰富过分单调的C,各种子函数兼容成面向对象,然后C+++±-简化成JAVA,JVM跨平台和网络的顺风车让他大火,接着发现同样是实现继承,多态,重载,重写和递归方法调用,单继承还行,多继承接口实现。JAVA蹩脚同时各种戴着镣铐跳舞的奇淫怪技,限制太多,现在行业JAVA的正确风气应该是提供接口这种正确的抽象而不是闭嘴硬是要继承带来各种限制。
但是,最适合跨平台网络编程那年JAVA火了,最适合GUI的面向对象火了。
如何看待Erlang之父Joe Armstrong觉得OO编程很烂? - 大宽宽的回答 - 知乎 https://www.zhihu.com/question/29888990/answer/703226836
强类型,类型类,kind,type ,typeclass------更泛型,类型类,近世代数,范畴------>研究世界的数学抽象方式。
世界运作的规律是:数学家演算纸上符号,物理学家的公式模型,计算机上仿真模拟的编程实物演算(机械时代用机械结构,电气时代用电子晶体管,没差了,知乎下“纯机械时代巅峰”),所有学科所有人都在做一件事“洞悉世界运作的规律”,它是
{–
尽管牛顿自己也没有说过力这种抽象,《原理》定义的是动量,导数关系导出的元素只是研究对象,不是最本质的定义实际意义的量,或者根本没有所谓最本质的东西,场论如果物质分布电磁场变成物质那么梯度,旋度,导数就是想要的东西了。这一切都只是符合现实的规律二律背反的 建模方式,并不知道那个是对的,或者都对,都是“冥冥中的世界运作的规律的抽象近似模型”,谁的描述方法更加精准形象就用谁的。
科学就是要自洽,严谨,满足客观实验规律,能用来指导生产生活才能被成为科学,而不是谬论。
–}
对于编程语言,我的观点觉得:没人关心你到底用的什么语言写的程序代码,用户只关心稳定,安全好用。老板只关心开发周期,开发成本,项目管理计划于安排。甚至连写代码的人都不关心这个语言还是那个语言,只要有好的知识轮子可以用,就是好语言。为了做出好的轮子,我们都不得不认真比较,毕竟每种编程语言就像每个学科不同的研究建模数学表达方式,都是为了一个目的“世界运作的数学原理”。
我感觉Haskell有着很多优点是其他语言赶不上的,而且,我觉得更重要的不是各种语言,而是定义一种所有语言通用的DLL,LIB,OLE之类的跨平台的所有编程语言都能进行交互,互相调用的“操作系统接口–协议–调用方法—或者说是约定”,具体说来就是一种通用的数据格式,代码模块化格式,方便各种语言互相调用(就像是数学方言之间的相互翻译和等价证明),Haskell最美的地方大概就是和数学接近吧!
如果所有编程语言都能通过“Haskell”作为桥梁接口连接沟通,而Haskell又能与数学语言翻译的话,那么,描述世界运作的“自然哲学里面的数学原理”就能通过Haskell完美诠释,以后数学书上那些公式就能很方便地编程计算机上的代码,用光速仿真模拟世界运作的规律!
数据结构算法,体系结构数值运算,操作系统算法,编译原理语法语义上下文无关,组合数学,离散数学,范畴学,图论,运筹学最优化仿真,统计机器学习,自然演化算法,lamnda演算相关+github编程论文项目,数值积分,逻辑数学异或,《数学与泛型编程》小蓝书…
很久我才明白一个道理:其实不必什么事情都一个人研究明白细节,因为Haskell研究科学,甚至可以说包括的不止上述信息。
只要学懂了,会发现,这一切科学发展思路基石都统一于研究一件事“世界运作的规律”
我做过调度算法,语法语义相关理解一些,但是编译原理还是没学明白!
难受!!做不出知识轮子,不能创造举一反三就是没学会!只会重复已经有的知识只是在耍流氓复读机,根本不是前赴后继前任肩膀上前行的真正的科学应该有的样子!!
注意,下列文章例子项目只是恰巧看到的距离或者常见的引导链接,实际上我觉得信息爆炸的互联网比起来,下面的范围连个粗浅的简要目录都算不上,
但是Haskell就是这么宽广的一个大世界!
[注] 下列标题中文,翻译成英文,不一定就是相关正确的术语搜索关键词,找准方向,深入了解,记得找准英文关键词。
[注] 下列链接只是为了说明Haskell的波澜壮阔,实际上互联网是很宽广的大海!
曾经,我有过一个想法,如果全世界的人共同维护一颗知识笔记书,让索引变得方便,共同编译一份项目,分好类,做好索引分享的话,很多前任走过的坑后人就不会再无效信息或者过期信息间不断跳转了,我本来还想做个项目,后来发现everything之类的项目,类似的我觉得不需要新建,跟着完善也不错,比如共同编辑的维基索引,领域相关的博客论坛社区,https://wiki.haskell.org/Haskell
喜欢Haskell的小伙伴一定能畅游到自己喜欢的地方!看烦了可以直接滚动屏幕到文末总结部门
https://github.com/krispo/awesome-haskell ,这里叫介绍了很多很不错的Haskell,我翻译在专栏就有。
包管理
https://github.com/haskell/hackage-server
系统接口
https://github.com/yesodweb/Shelly.hs
Hackage,Stackage,Hoogle,Github,wiki相关,stack flow相关,社区论坛 Etc.
##用haskell单子优势处理JSON,XML,字符串,websocket,HTTP,序列化,Protobuf,MessagePack,网页模板编程,或者生成SQL,parser解析器…
Haskell处理XML
https://blog.csdn.net/kowity/article/details/8134477
应用例子 http://www.aqee.net/post/why-haskell-is-worth-learning.html
import Control.Lens.TH
data position = position {posX:: Double,posY::Double}
makeLensess ''Position--AST抽象语法树abstract syntax tree
Q单子
拼接
reify
其实这个我是在魔力haskell第一次看到的haskell相关库的使用介绍的,韩冬不愧是使用haskell做工程的背景。
https://github.com/Gabriel439/Haskell-Optparse-Generic-Library
www.voidcn.com/article/p-kaljxhgr-qd.html
代数类型是指和sum类型,积product定义出来的数据类型,递归类型
https://github.com/Marwes/haskell-compiler
Haskell to JavaScript compiler,
https://github.com/ghcjs/ghcjs
https://github.com/ghc-proposals/ghc-proposals
https://github.com/johang88/haskellinjavascript
https://github.com/alephnullplex/cradle
A GHC-based Haskell to JavaScript compiler
https://github.com/valderman/haste-compiler
optparse-applicative命令行参数解析器函数库
https://hackage.haskell.org/package/optparse-applicative
https://github.com/sdiehl/kaleidoscope
https://github.com/llvm-hs/llvm-hs
LLVM是一种静态类型的中间表示和相关的工具链,用于操作,优化和转换此中间形式为本机代码。LLVM代码有两种形式,二进制bitcode格式(.bc
)和程序集(.ll
)。命令行工具`llvm-dis`和`llvm-as`可用于两种形式之间的转换。我们将主要使用人类可读的LLVM程序集,并将其随意引用为*IR,*并保留单词程序集以表示作为编译结果的本机程序集。一个重要的注意事项是LLVM bitcode 的[二进制格式](http://llvm.org/docs/BitCodeFormat.html)以魔术双字节序列(0x42 0x43)或“BC”开头。
LLVM 模块由一系列顶级的相互作用的函数定义,全局变量,类型声明和外部声明组成。
LLVM模块中使用的符号是全局的或本地的。全局符号@
以及本地符号开头%
。必须定义或转发所有符号。
declare i32 @putchar(i32)
www.stephendiehl.com/llvm/
并行parallel函数库
并发forkIO
STM
aysnc
{-#…#-}
{-#UNPACK#-}
编译选项
-Wall打开所有警告
运行分析-prof
-threaded多线程
-stat链接器linker用静态库打包exe会很大,但是环境要求不太高。放哪儿都能用。
module Main where
main = print (fib 30)
fib n= if n<2 then 1 else fib(n-1)+fib(n-2)
{-
ghc - prof -fprof-auto -rtsopts Main.hs
Main.exe +RTS -p在Windows下
./Main +RTS -p
-}
module Main where
main = print (fib 30)
fib n=let fibs = 0:1:zipWith (+) fibs (tail fibs) in fibs !! n
RTS -p时间消耗
RTS -h内存消耗
Main.exe +RTS -h
hp2ps Main.hp
open Main.ps
https://github.com/tibbe/template
https://github.com/jyp/glpk-hs
An efficient packed, immutable Unicode text type for Haskell, with a powerful loop fusion optimization framework.
https://github.com/haskell/text
https://github.com/glguy/utf8-string
https://github.com/haskell/base64-bytestring
https://github.com/Daniel-Diaz/HaTeX
https://github.com/batterseapower/charsetdetect
https://www.zhihu.com/question/37748492/answer/73360072
Haskell适合做网站开发吗?有什么优缺点?
本人Haskell基本算是入门了 最近接了个网站开发的活 我先试试用Haskell来写(为了攒Haskell经验以方便找工作)看了几个Haskell做的网站感觉不错的样子。有没有哪位大神用过Haskell做网站的?听说那个Yesod很好用的样子?都有哪些优缺点,会不会有很多坑呢?网上搜了一些文章都是很多年前的了。哪位大神来简单回答一下?
https://www.zhihu.com/question/37748492/answer/73360072
作者:祖与占
链接:https://www.zhihu.com/question/37748492/answer/73360072
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
先吐槽一下
最近接了个网站开发的活 我先试试用Haskell来写(为了攒Haskell经验以方便找工作)看了几个Haskell做的网站感觉不错的样子。
如果是那种写完能拍拍屁股走人的项目用Haskell还好, 不是并且需求变动多或者略奇葩的话还是乖乖用PHP/Python/Ruby挑个实用的框架就算. Web开发的知识经验是基本上是语言无关的, 还有什么工作需要Haskell经验的请联系我, 好像并没有多少不是玩票性质用Haskell写的网站公开代码, 不要看着前端写得好看就感觉不错
用Haskell做Web开发最大的优点大概只有"类型安全"这点(连HTTP都搞了个http-types: Generic HTTP types for Haskell), Rapid Prototyping这个别的语言框架都可以做到; 性能? Go, Rust这些新生代编译语言性能已经不差, 并且Haskell的内存管理性能调优监控会的人凤毛麟角, 谈不上优势.
具体到框架上, 比如说差不多跟Rails同一个量级的Yesod, 相对于别的比较全的框架比如Snap, Happstack, 更新比较快, 文档健全, 周边配套比较完善. 但是Yesod里面有很多高级的类型魔法Type Family, Template Haskell 虽然可以不需要太了解这些特性就能写出代码, 但是出了问题或者偏离框架适合的应用场景(也就是你Google或者SO找不到代码来复制粘贴)的时候就会没辄. 最近发现Thoughtbot写了个挺靠谱的例子thoughtbot/carnival · GitHub. 至于更加轻量的Scotty, Spock跟Sinatra差不多个路子 (
在两三年前SPA开始慢慢出现时, 我感觉到Haskell, Scala这种语言挺适合开发API服务器. 因为服务端跟客户端通讯需要Contract, 强大的类型系统正好可以作为这个Contract(然而当时我并不知道Grape跟Swagger这种存在, 并且Haskell的类型系统不足以表达JSON Schema里面的所有约束, 或许LiquidHaskell的Refinement Types能够满足, 别跟我提SOAP, WSDL), 另外一点是这些语言做JSON(反)序列化会稍稍快些, 用上Aeson会飞 (
在那段时间到Servant出来之前大概有两个东西比较出名, 一个是Silk出的Rest, 另一个是 postgrest, 前者通过一套DSL来定义数据模型(资源)生成服务端客户端代码,文档, 后者直接在Postgre上套一层API, 这两个的限制在于都限制在RESTful API上可定制性不是很高. 然后轮到Servant, 简单来说Servant就是用Type-Level DSL来定义HTTP接口(不受限于REST), Type-Level DSL优势在于能够expose 类型信息, 比仅仅是结构的DSL好生成代码得多, 打这么多字好累, 看这里好了 ChicagoHaskell/servant-presentation · GitHub 有代码有slides
前端部分, Yesod那些莎士比亚模板语言还算能用. 主流的BlazeHtml , Lucid 都挺好看, CSS只有个 Clay. Compile2JS早点就有Fay, Haste都是实现GHC的子集, GHCJS渐渐能用, 但是为了实现Haskell的语言都拖着个Runtime, 生成的文件庞大, 也已经有FRP系统在上面实现(reflex). 语法特性类似Haskell的Purescript亲和性更加好一点, 各种binding都比较齐全, 也有自己的生态.
至于坑, 用小众语言做实际项目坑是不可避免的, 大众语言大众库即便有坑多人踩了就有PR, Workaround, Haskell不但小众而且语言问题也不好解决, 碰到个不懂的概念就好多时候就瞎眼. 开发网站用传统的服务器渲染, 在关系数据库上CRUD能很好解决. 如果网站规模变大, 组件一多(Message/Job Queue, NoSQL DB, 各种Service), Haskell有些Binding或者DB Driver质量或者维护不是很好要么就自己动手, >要么就换别的语言的库, 再跟各个组件通讯. 这种结构会给运维和系统稳定性带来不少麻烦和风险.
即便如此, 不是不推荐用Haskell, 毕竟需要更多人填坑修路
bytestring 函数库,Lazy Bytestring|ByteStrung Builder
text 和utf8-string函数库
mono-traversable 函数库
haskell发力点,webassembly第一个用的都是haskell小坦克游戏
wai/warp
wai-extra
编程框架思路:这些网络编程框架大多提供一个HTTP的单子抽象,单子提供Reader环境,可以读取要求信息,同时提供一些Writer操作,用来HTTP响应,eq:apiary函数库提供的ActionT单子变换
WebSockets函数库
Socket编程
序列化/反序列化,把内存中“活”数据<->传输/存储序列化格式JSON,MessagePack,Protobuf…
重复代码很多解决办法:
aeson函数库
模板自动生成ToJSON/FromeJSON
泛型自动生成ToJSON/FromeJSON
泛型编程
attoparsec函数库
protobuf函数库
reanimate
https://github.com/elginer/shpider
https://github.com/chrisdone/vado
https://github.com/Soostone/cassy
Haskell Web Application Interface
https://github.com/yesodweb/wai
haskell-distributed.github.io
https://github.com/haskell-distributed/distributed-process
https://github.com/agrafix/Spock
https://github.com/msgpack/msgpack-haskell
https://github.com/jtdaugherty/HaskellNet
https://github.com/GaloisInc/haskell-tor
https://github.com/haskell-wasm/wasm
https://github.com/mattgodbolt/compiler-explorer
Haskell WebAssembly Toolkit
https://github.com/SPY/haskell-wasm
https://github.com/NetASM/NetASM-haskell
https://github.com/HaskellCNOrg/snap-web
https://github.com/ku-fpg/blank-canvas
https://github.com/laserpants/hashids-haskell
https://github.com/awakesecurity/gRPC-haskell/blob/master/examples/tutorial/TUTORIAL.md
https://github.com/jaspervdj/hakyll
https://github.com/sebastiaanvisser/clay
https://github.com/kazu-yamamoto/dns
https://github.com/ocramz/xeno
https://github.com/depressed-pho/HsOpenSSL
https://github.com/dpwright/HaskellNet-SSL
https://github.com/haskell/HTTP
https://github.com/aristidb/aws
https://github.com/dhall-lang/dhall-haskell
https://github.com/bos/aeson
https://github.com/tweag/sparkle
HDBC
postgresql-simple,mysql-simple,sqlite-simple
persistent
groundhog
esqueleto:比如DSL书写SQL的好处
opaleye
https://github.com/fpco/odbc
https://github.com/paul-rouse/mysql
Opaleye是一个Haskell库,提供用于定位Postgres的SQL生成嵌入式域特定语言。如果要使用Haskell编写类型安全和可组合的代码来查询Postgres数据库,则需要Opaleye。
“Opaleye真的很棒。你已经设法带来关于关系数据库的精彩内容并给它类型安全和组合(即Haskell的精彩内容)” - Daniel Patterson,职位发展
“我们将它用于大多数数据库代码。它非常灵活,几乎总是像手动编写的查询一样高效 ” - Adam Bergmark, Silk.co
Opaleye允许您在Haskell代码中定义数据库表并针对它们编写查询,并且旨在成为类型安全,因为如果您的代码编译,则生成的SQL查询在运行时不会失败。支持广泛的SQL功能,包括内部和外部联接,限制,聚合,不同,排序和限制,联合和差异。还提供了插入,更新和删除表的工具。使用Opaleye编写的代码可以在非常精细的粒度级别上进行组合,从而促进代码重用和高级抽象。
https://github.com/tomjaguarpaw/haskell-opaleye
https://github.com/mongodb-haskell/mongodb
https://github.com/hdbc/hdbc
数值计算领域Haskell或者Idris想要达到C/C++的运行效率,是否存在理论上的障碍?
Haskell或者Idris作为高级语言,和C/C++比起来当然有它们的先天不足,但是这两个语言用类型系统提供了某些在C/C++中编译器不可能知道的信息,原则上可以用来提供优化的依据,所以也有它们的优势。我认为这个问题的答案并不那么显而易见。
效率是可以进行一般比较的,比如,OJ上刷题的运行时间分布就可以作为一种度量。
作者:祖与占
链接:https://www.zhihu.com/question/301111822/answer/524107809
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
是否存在理论上的障碍?
我觉得是不存在. 数值计算效率的瓶颈在于能否最大化利用硬件, 例如搞 CPU 的 Intel 出的 MKL 就比其他 BLAS, LAPACK 实现要猛. 所以只要搞编译器有足够的投入, Haskell 做数值计算的效率肯定是可以追赶上 C/C++ 的. 但是 Haskell 还有个操作是可以搞 EDSL, 搞 inline-*: 搞个可以编译到 C/C++ 的专门做数值计算的 EDSL, 可以在类型系统做方便生成高效代码的约束, 还可以用 inline-c/cpp/r/java/rust, 想调什么语言就什么语言, 拿 Haskell 做胶水, CPython 实现也很慢, 还不是很火, 还不是调用各种 BLAS, LAPACK 实现?
对内存分配的压力有怀疑的话完全可以让上面说的 EDSL 语义完全是 strict 的嘛, 后面还有 Linear Type, 管理好生命周期应该不会比 C/C++ 差不太远的, 或者完全 fusion 掉?
现状是 Haskell 的 de facto 编译器实现 GHC 的 SIMD 支持还在路上 (GSoC 2018 搞的), Accelerate 现在的维护状况还不错, 也有 LLVM 的后端, 具体例子可以看 Haskell for Numerics?
https://wiki.haskell.org/Numeric_Quest
http://www.philipzucker.com/a-touch-of-topological-quantum-computation-in-haskell-pt-i/
Haskell Pt中的拓扑量子计算。
https://github.com/mokus0/polynomial
https://github.com/mokus0/polynomial
https://github.com/ocramz/sparse-linear-algebra
https://github.com/frizensami/haskell-optimization
https://github.com/erikd/haskell-big-integer-experiment
其实我觉得λ演算很适合做这个的。
https://github.com/IagoAbal/haskell-z3
高数线性代数
proof of hakell symbolic calculus theorem
Linear algebra of higher numbers
https://github.com/jwiegley/coq-haskell
https://zhuanlan.zhihu.com/p/31567423
Haskell保存公理公式和运算,实现证明高数书本的过程!!
!!翻译,一个高校计算机演算数学公式的过程!
机器数学证明,把求导积分微分等等放进去操作的约定,人不推导公式,人用它来发现新的公式!
机器几何证明!
https://zhiwei.li/text/2010/06/10/haskell程序推理/
https://github.com/antalsz/hs-to-coq
用Haskell编写的prolog解释器。
https://github.com/Erdwolf/prolog
Hakell Semantic Grammar Analysis and Compilation Principle
张凇书本P179,P285
https://github.com/ollef/Earley
https://blog.csdn.net/libinbin_1014/article/details/78833172
https://www.cnblogs.com/ghjbk/p/6953619.html
https://www.haskell.org/happy/
性能比 Parser Combinator 好, 错误信息也可以比 Parser Combinator 精确, GHC 自己也在用, Purescript 最近也用 Alex+Happy 实现 concrete syntax parser 了, 从 yacc+bison 过来的也很容易迁移, 例如 language-c . Parser Combinator 用起来很 fancy, 而且更灵活, 例如 Alex+Happy 就不好描述二进制数据, attoparsec 就可以都处理. 可维护性来说我觉得两个都差不多.
作者:匿名用户
链接:https://www.zhihu.com/question/324648976/answer/685468829
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
就是Haskell的LEX和YACC,每个正经语言都有这两个东西,没什么可说的
Parser Combinator 是Haskell独有的,别的语言也在模仿,但是没有惰性求值就是瞎折腾
具体到Parsec,可以参考我这个回答
[Parser Combinator 在语法解析的当中处于怎样的位置?www.zhihu.com(https://www.zhihu.com/question/35778359/answer/65087586)
作者:baozii
链接:https://www.zhihu.com/question/324648976/answer/692025252
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
它是不是直接解决了Alex和Happy用户搞不定Layout的痛点?
https://github.com/BinRoot/Haskell-Data-Analysis-Cookbook
https://github.com/Gabriel439/Haskell-Typed-Spreadsheet-Library
https://github.com/timbod7/haskell-chart
ML Statistical Learning Jullia, Python Interface Calls Universal Manod
https://github.com/tensorflow/haskell
https://github.com/austinvhuang/awesome-haskell-deep-learning
https://www.zhihu.com/question/38295817/answer/75849804
https://github.com/alpmestan/hnn
https://www.forbes.com/sites/quora/2018/01/24/when-is-haskell-more-useful-than-r-or-python-in-data-science/#d6707a069e47
https://blog.csdn.net/lyndacn/article/details/80882257
https://www.zhihu.com/question/40703653/answer/88245442
github项目processing
processing-for-haskell
haskell-playground/graphics
Topic:Graphics.Github很多haskell 计算机图学项目汇总,直接搜索Computer graphics . haskell .github
Haskell Image Processing Library
https://github.com/jcollard/unm-hip
gloss就不错,还有很多,一搜就有。
reanimate- Animation library based on SVGs-
opengl+haskell
computer aided design CAD+haskell
haskell建模框架也有很多在hackage,stackage能找到的,类似plantsimulation等领域语言编程框架
A math-inspired CAD program in haskell. CSG, bevels, and shells; 2D & 3D; gcode generation…
https://github.com/colah/ImplicitCAD
www.implicitcad.org
https://github.com/music-suite/music-suite
A terminal music player based on afplay
https://github.com/potomak/haskell-player
https://github.com/lettier/gifcurry
Your open source video to GIF maker built with Haskell.
https://lettier.github.io/gifcurry/
Minimal Haskell bindings to the FFmpeg library
https://github.com/acowley/ffmpeg-light
https://github.com/5outh/Bang
https://github.com/viskell/viskell
Viskell是一种用于类型(类似Haskell)的函数式编程语言的实验性可视化编程环境。该项目正在探索交互式可视化编程的可能性和挑战,并结合功能语言的优点和缺点。
https://github.com/LumiGuide/haskell-opencv
https://github.com/bgaster/hopencl
https://github.com/hasura/graphql-parser-hs
https://github.com/madjestic/Haskell-OpenGL-Tutorial
https://github.com/bergey/haskell-OpenGL-examples
Write type-safe GraphQL services in Haskell
https://github.com/haskell-graphql/graphql-api
https://graphql.org
https://github.com/bitemyapp/bloodhound
https://github.com/ndmitchell/hoogle
https://github.com/CIFASIS/QuickFuzz
https://github.com/adscib/monad-bayes
https://github.com/GaloisInc/RSA
www.euterpea.com
https://github.com/spell-music/csound-expression
https://github.com/AccelerateHS/accelerate
Efficient Haskell Arrays featuring Parallel computation
https://github.com/lehins/massiv
高性能计算中,多核并行编程正统选择:C++/Fortran + OpenMP C++/Fortran + MPIC++/Fortran + MPI + OpenMP 其次:Matlab的Parallel Computing Toolbox Matlab Parallel Computing Toolbox配合C++(Matlab主要负责调度)普通的科学计算(对性能没“极致”要求),Python(用Multiprocessing)、Julia、Haskell等等随便玩玩。 非要用函数式语言的话,Mathematics、Haskell可以试试。而并发编程的概念更广,可选的语言、模型、框架很多,除了上面的,Erlang、Scala Akka、Ocaml Async,Clojure atom/ref/agent。。
作者:rainoftime
链接:https://www.zhihu.com/question/30985257/answer/50200293
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
https://www.zhihu.com/question/22115397/answer/30632716
https://github.com/chrisdone/dynamic
https://www.zhihu.com/question/19847363/answer/17355845
垃圾回收
异常处理
运行时异常
Either/Maybe
异步异常处理
try catch
resource函数库
单子用作异常处理
exceptions函数库
monad-control单子栈操作库
https://github.com/freebroccolo/docker-haskell
https://github.com/freebroccolo/docker-haskell
https://github.com/aviaviavi/legion
https://github.com/facebook/Haxl
A Haskell library that simplifies access to remote data, such as databases or web-based services.
VCache通过ACID事务向Haskell提供扩展的持久内存。目的是支持对数据进行操作的应用程序,这些数据远大于系统内存,或者需要几乎透明的持久性。VCache使用两个主要概念:VRef和PVar。
https://github.com/dmbarbour/haskell-vcache
https://github.com/dmbarbour/haskell-vcache
Algorithms from Artificial Intelligence: A Modern Approach by Russell and Norvig.
https://github.com/chris-taylor/aima-haskell
A breakout game in Haskell using SDL and FRP, with Wiimote and Kinect support.
https://github.com/ivanperez-keera/haskanoid
hakell fractal. autotune
https://gregheartsfield.com/fractal-hs/
https://github.com/cies/haskell-fractal
Logical Calculus–Natural Evolution Hakell
https://github.com/owickstrom/motor
https://wiki.haskell.org/Game_Development
Yampa /游戏引擎
A lightweight, cross-platform, OpenGL/GLUT-based 2D game engine in Haskell
https://haskell.libhunt.com/categories/2947-game-engine
Haskell game engine library for roguelike dungeon crawlers; please offer feedback, e.g., after trying out the sample game with the web frontend at https://lambdahack.github.io
一个Haskell的游戏框架:ActionKid。
helm: A functionally reactive game engine.
https://github.com/wavewave/haskell-android-example
https://github.com/abarbu/haskell-mobile
老爷子后来认为Erlang是OOP,但是这个OOP和其他人理解的不一样:
- 常规认为OOP=封装+继承+多态
- 老爷子认为OOP=消息传递 + 隔离 + 多态,其中消息传递最重要,隔离和多态都源自于消息传递。
Smalltalk的作者Alan Kay更是认为Messaging是唯一重要的事情。从这个角度,Erlang非常OOP。所以老爷子其实是支持OOP的,但是他支持的不是题主要问的Java那种OOP。
作者:大宽宽
链接:https://www.zhihu.com/question/29888990/answer/703226836
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
(亲身经验,学完java接口再看Haskell类型类,异常处理并发线程等等,绝对有启发有帮助!)
https://www.zhihu.com/question/67678268/answer/255774559
作者:非构造性雨轩菌
链接:https://www.zhihu.com/question/67678268/answer/255774559
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
没有,java和haskell都是作为图灵完备的语言而设计的。(逃
嘛,更容易做到的和更难做到的倒是一个很大的话题。这里以我自己的理解和经历取多个方面不完全的列举一些简单的例子吧
和语言的社区、学习相关的:
现在JAVAC++之类的面向对象都是C语言模块化封装,加上各种因此精心设计的语法泛型编程技巧,
不考虑实现OO的意义,仅考虑实现OO的思路和效果(
比如existential type class用于模拟inheritance。。
https://www.zhihu.com/question/52412654/answer/130426928
https://github.com/fumieval/objective
https://github.com/typelead/eta
https://github.com/Frege/frege
Lambda Calculus Hardware Circuit, CPU, Fourier Transform Integral Transform Chip, MCU Chip Circuit,
既然能用机械差分机演算积分微分,那么电路也能物理手段演算一些数学定律,比如傅里叶变换积分变换芯片,群论相关结论芯片电路,或者专门为了计算的GPU改良版,那么有没有“λ演算芯片”?
卡脖子技术不是别人知识轮子上的说明书,而是他们没告诉你的,怎么造出来轮子的基础原理技术。
Wiki相关介绍
Haskell的DSL用来写VHDL,可和第三方EDA链接(Modelisim,Quartus)
嵌入在haskell的硬件描述
David J.King & Jhon O’Donnell’s digital circuit simulator.
指定和原型制造微处理器
Hawk语言=haskell+hawk库
haskell EDSL 用于硬件描述
借用haskell函数式语法高级描述转换为低级VHDL,Verilog,SystemVerilog,说到底还是Haskell适合用haskell单子优势处理DSL领域相关问题,正如前面的例子,用haskell单子优势处理JSON,XML,字符串,websocket,HTTP,序列化,Protobuf,MessagePack,网页模板编程,或者生成SQL,parser解析器。。。。。。
github:HaSKI
Functional High Concurrent Operating System.
Haskell Users’s Operation System and Environment.
https://github.com/dls/house
https://github.com/tomsmalley/semantic-reflex
https://tomsmalley.github.io/semantic-reflex/
其实直接ghc Main.hs就可以。
hakell programming exe
https://github.com/dkubb/haskell-builder
https://github.com/winterland1989/stdio
不想引战,但是我觉得python胶水粘不牢,类库包管理混乱,开源社区虽然都有这种缺点,而且python也在改正,但是我感觉它做不到太高效率干净整洁地完全独立出来。Anaconda,JupyterNotebook各种语言内核玩转的确让我甚是喜爱,但是我的确觉得python的C打包味道不够干净。
但是Fp还没足够强大,这也是需要越来越多人加入改变他的理由!
理论上我感觉,Haskell似乎在现有语言之间进行安全性,抽象性和实用性之间的绝佳权衡。
OLE,DLL,LIB,混合编程,Haskell可能是最好的胶水语言。计算机优势是重复光速大内存,haskell也能提供一种很好的利用计算机资源的方法。
现在学术界喜欢Haskell低调研究,不想成功火起来,从而方便一些实验性的代码能够经过调试而不是错误代码就被广为流传到处使用(比如那个C操作系统那行被作者注释了临时代码表明不合适,希望以后有人修改的,后来没改不但还把注释删除了的事情)。官网其实希望Haskell用来研究,而其他他衍生出来的商用语言用来“工业使用”。
想要商用,想要Haskell火起来,重点就是我说的前文的生态问题的解决,让Haskell成为能够调用整个“计算机所有软硬件资源的完美接口灵活”的通用性语言,用“操作系统接口调用方法”打通所有语言之间的“壁垒”。
Telegram Bot API for Haskell
https://github.com/klappvisor/haskell-telegram-api
https://docs.haskellstack.org/en/stable/README/
hakell混合编程数据接口dll,良好的文件管理和I/O
https://github.com/phadej/github
A Haskell kernel for IPython
https://github.com/gibiansky/IHaskell
https://github.com/bjpop/language-python
https://github.com/tweag/HaskellR
https://github.com/tensorflow/haskell
https://github.com/mchakravarty/language-c-inline
https://github.com/jarrett/cpphs
**什么是fficxx?
**
fficxx(“eff fix”)是C ++的自动haskell外部函数接口(FFI)生成器。
https://github.com/wavewave/fficxx
Tools for making it easier to integrate Haskell and Objective-C
https://github.com/jspahrsummers/ObjectiveHaskell
https://www.zhihu.com/question/39207822/answer/80352685
Haskell 与 C++的交互性如何?
llvm-general: General purpose LLVM bindings
今日发现一 llvm 相关的 package,其介绍:
llvm-general is a set of Haskell bindings for LLVM The LLVM Compiler Infrastructure Project. Unlike other current Haskell bindings, it uses an ADT to represent LLVM IR (LLVM Language Reference Manual), and so offers two advantages: it handles almost all of the stateful complexities of using the LLVM API to build IR; and it supports moving IR not only from Haskell into LLVM C++ objects, but the other direction - from LLVM C++ into Haskell.
看题主的描述,这个package是可以把Haskell编译成的IR与C++编译好的IR相互移动,大概可以实现Haskell调用C++模块或相反,但IR本身是属于汇编level的语言,很难恢复成高级语言的,所以互译不现实
Haskell 与 C++的交互性如何? - 王喆的回答 - 知乎 https://www.zhihu.com/question/39207822/answer/80352685
越是抽象高屋建瓴得到的理论结论越是内涵,这种规律越是容易映射到其他事物上,高处不胜寒,就像数学,越学越发现回头看的以前的结论是降维特例而已,代码也一样,很Trivial,这些二元运算在自函子范畴上很有效,幺半群的结论都满足。适用性广意味着我不用费脑筋考虑它失效的条件是什么。最妙不可言的是,语言内核居然惊人的简单,人类的本质是复读机,难道计算机世界运作的本质规律是复制M-w粘贴C-y?通过模式匹配有选择地M-w/C-y,通过递归重复执行M-w/C-y?
优点
学习haskell将改变您对编程的看法。 (人们经常发现,一旦他们学会了哈斯克尔,他们就会发现自己在其他语言中编写类似于哈克尔的代码)
类型安全是否高于主流语言(空指针例外?)
类型推断意味着除非绝对必要,否则您不必担心类型。
它可以生成高性能的可执行文件。
par和pseq组合器的并行性几乎微不足道
交互式环境(hugs/ghci)可让您快速构建想法
有一个很好的支持社区(irc,邮件列表等)
非常富有表现力和简洁的语法
GHC正在积极开发和改进,包括支持GPU上的代码执行以实现高性能计算的额外优势
QuickCheck>单元测试
缺点
学习haskell会破坏所有其他语言。
进入
非常复杂
非常容易编写无人理解的神秘程序,几天后甚至不是你自己
还有人说
优点:
https://www.oschina.net/translate/state-of-the-haskell-ecosystem-august-2015 翻译不太好,建议看原文https://github.com/Gabriel439/post-rfc/blob/master/sotu.md 这里里谈到很多领域方面haskell应用领域+编程需求
1)Haskell是最先进的编程语言。 我做了一些研究,haskell似乎是唯一真正的最先进的编程语言。还有其他像agda和coq,但这些都是实验性的,缺乏现实世界编程的功能(例如图书馆支持)。最好投资一种最先进的编程语言。 (注意:我没有争论为什么haskell是最先进的,几乎任何其他编程语言都没有。这需要花费太多时间。所以这只是我的主观意见。同样适用于其他陈述。) (注意:我后面提到的一些功能可能是GHC特定的,但我仍然只写haskell)
2)Haskell程序员通常非常聪明。库的代码质量非常高。此外,stackoverflow的提示写得非常好,并且也处于高水平(感谢Don Stewart这样的人,仅举一例)。我认为改进编程的最佳方法之一是学习其他人的代码。 Haskell在这方面非常出色。
3)moste OOP语言中的命令式编程已经过时。通常的副作用编程方式也是如此。但是很少有编程语言用于没有副作用的声明性编程。例如Scala,F#,Ocaml和Erlang不是副作用。 (但是,在OOP语言的学术领域也有工作,显然没有过时。考虑Alan Kay过去的工作,或者例如Smalltalk领域当前最先进的学术工作。)
4)Haskell支持使用抽象数学概念进行编程(例如monad,functor,combinators,GADT等)。我认为这可以提高编程效率。
5)Haskell类型系统非常灵活,支持类型推断。这大大减少了可能的错误。在编译时检查类型系统。类型系统有助于作为文档。
6)首先在haskell中实现一些最先进的概念(如QuickCheck库)。有很多有趣的扩展。
7)haskell语法设计得很好。没有不必要的括号。代码紧凑,模式匹配和列表理解的synatax非常好。像Knuth这样的人提倡有文化的编程,而haskell/GHC则支持它。
8)haskell支持懒惰评估
如果你编写一个需要不断改变状态的程序,那么Haskell是一个糟糕的选择。 如果在对问题进行建模时,它不适合函数编程,例如编写CAD(计算机辅助设计)程序,那么OOP将是更好的选择,因为编程范例更适合模型。 但是,如果您不受这些问题的影响,那么Haskell可以成为一种很好的语言。解决办法:利用“计算机系统接口混合编程”
haskell的wiki上有汇总总结,基本上是一年两期,今年还只有上半年的第一期。
https://www.haskell.org/haskellwiki/Haskell_Communities_and_Activities_Report
你感兴趣可以去看看那些实践者们都是用在什么场合就大概可以体会一点haskell在工程中的优势了。
其实我看这个报告的时候有些失望,因为工程项目确实是少,当然这是符合haskell的热度排名情况的(常年40左右)。
haskell最能体现工程层面优势的项目应该是,io少,内存不紧张,业务逻辑特别复杂且多变的项目。
Haskell用在工程項目中有什麼優勢? - 随心所往的回答 - 知乎
https://www.zhihu.com/question/26510008/answer/33050372
好产品例子Pandoc
https://github.com/jaspervdj/patat
1)这很难学,掌握haskell需要数小时,数月。没有适当的计算机科学背景就更难了。像Monads和Functors这样的东西很难理解,特别是没有数学背景。所以大多数程序员可能没有能力或愿意学习haskell。 Haskell并不“简单”。如何使用支持所有高级功能的简单语言是不可能的。
2)IDE选项不如其他编程语言好。我使用leksah作为我的IDE,它非常好,但它与Eclipse的java开发无法比较。
3)Haskell不能用于Android或Iphone开发。相比之下,Scala可以用于Android开发,它也兼容java,这是一个巨大的优势。
4)我认为一些图书馆缺乏支持维护和改进它们的人。我在haskell中进行语义Web编程,并且库支持可能更好。
Haskell不适合所有项目。如果你需要每毫秒的性能,C/C++仍然可能是最好的选择。因此,haskell适用于许多项目,但不是全部。 Haskell与其他编程语言相比具有许多技术优势。但是,可能存在反对使用haskell的政治原因。例如,Scala可以更好地与现有的Java基础架构集成。
知乎作者:随心所往说:链接:https://www.zhihu.com/question/26510008/answer/33050372 :
还要一个值得一提的是Zipper,learn you a haskell for good 的例子已经够好了。参考链接 zippers。当然,Haskell这一类fp的语言面前,递归结构书写出来都是很漂亮的。只是遇到状态变更一类的场景时,显得有些别扭,不如直接通过指针修改来得高效。
作者:夜色残阳
链接:https://www.zhihu.com/question/32163076/answer/254083860
https://blog.csdn.net/quicmous/article/details/82222038
王垠也写过一篇吐槽Haskell的.
Safe or Convenient?
的确,谁家通信总拿根管子传来传去?你说安全,可惜我觉得不方便,这真是个问题。
但是,真正值得传递的到底是什么?想起来,《Mathematica演示项目笔记》吴飞说过,编程到后面,变量都不是蓝色的,至少是草绿色或者墨绿色。
再引用一遍。
老爷子后来认为Erlang是OOP,但是这个OOP和其他人理解的不一样:
- 常规认为OOP=封装+继承+多态
- 老爷子认为OOP=消息传递 + 隔离 + 多态,其中消息传递最重要,隔离和多态都源自于消息传递。
Smalltalk的作者Alan Kay更是认为Messaging是唯一重要的事情。从这个角度,Erlang非常OOP。所以老爷子其实是支持OOP的,但是他支持的不是题主要问的Java那种OOP。
作者:大宽宽
链接:https://www.zhihu.com/question/29888990/answer/703226836
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
oo分流派的,现在通常说的oo是指java/c++这一派,搞类、搞继承、搞多态。古典oo是erlang这一派的,每个对象object是个actor,对象间通过消息通讯,没有继承这一说,对象间不共享状态。Joe看不起现代派oo。erlang自己是古典派的,如何看的起现代派。至于c++标志性的template,不属于oop的概念。Alan Kay,oop概念发明者,也是图灵奖获得者,说了:OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. OOP对我来说,就是指消息、本地记忆与保护、隐藏状态与进程、所有事物的极端延迟绑定。可以在Smalltalk也可以在LISP实现。据我所知,殿堂级大师,都看不上以Java/c++为代表的现代派oop。
作者:码师兄
链接:https://www.zhihu.com/question/29888990/answer/704512665
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
虽然最终决定脑袋决策的是屁股。
发明haskell的大佬说了,希望Haskell成为学术类可以不断发展的低调的语言,要“商业成功”,换个名字加别的属性改成别的语言吧,只有不流行,不广为传播,GHC发生的错误才能被及时纠正。而不是像那行明知道不合适的OS代码,作者都标注明白这样写不好,希望后来人改好,却广为流传以至连那行注释都被删除了。
[注]引用没有标明出处请告知