文章目录
- 抽象范式灵活石一样灵活表达自由
-
- 什么是编程语言?
- 推荐论文
-
- 大佬建议
-
- Meta
- Haskell 实现
- 类型系统
- 语言抽象/模式
- 问题解决方案
- Haskell工业界有哪些实际应用?
- 关于fp的一些思考
-
- 递归是循环的超集。
- 同样是a higher level of abstraction轮子封装。
- 抽象万花筒是编程语言多样化的根本原因
- Haskell,你是话题之王吗?
- 令人敬畏的Haskell辅助列表链接、框架、库和软件
- 知识生态!
-
- DSL领域编程
- DSL翻译其他语言的编译原理,语法分析器 模板编程 泛型编程
- 模板template编程
- 模板编程
- 泛型
- 编译器
- 解析器paser
- Haskell LLVM JIT Compiler Tutorial
- 并行并发
- 语言扩展和程序标记ghc表一编译相关技能
- Regex/文本处理/自然语言处理/NLP
-
- latex文本处理
- 快熬出头的Haskell大前端
-
- 适合吗?网络编程优缺点
- 字符串
- 网络编程
- serialize序列化/反序列化与泛型编程
-
- React App etc.Big Web Products
- A demo web browser engine
- The intent is to develop a high quality, high level driver similar to pycassa.
-
- WSAM
-
- NetASM
- canvas
- port
- GRPC
- CSS
- DNS
- Fast Haskell XML parser
- OpenSSL binding for Haskell
- SSL
- http
- Amazon Web Services for Haskell
- YAML
- JSON文本处理
- Apache
- 数据库
-
- SQL
- hakell计算效率
- 量子力学
-
- 多项式
- 矩阵计算,数值分析等等
- haskell-optimization
- 大数计算
- 命题逻辑、阶级逻辑、形式验证、定理证明、数学猜想
-
- Haskell bindings to Microsoft's Z3 API (unofficial).
- hakell符号计算定理证明coq
- Haskell程序证明
- Convert Haskell source code to Coq source code
- Prolog
- hakell Paser语义语法分析-编译原理
-
- Haskell的LEX和YACC
- 如何评价Haskell的Parser Generator BNFC?
- 数据分析
-
- 电子表格
- 画图
- ML统计学习Jullia,Python通用接口调用Manod
-
- 深度学习
- 人工神经网络
- 何时HaskellR或在数据科学中Python更有用?
- 好玩的CAD/CAE
-
- 图像处理
- Hackage上视频框架,图像处理框架
- 建模、计算机辅助设计CAD
- MusicPlayer GIF
- FFmeg
- MIDI
- 可视化
- OpenCV
- openCL
- OpenGL
- OpenQL
- 搜索猎犬框架
-
- 搜索引擎
- QuickCheck
- 概率编程
- RSA加密
- haskell音乐框架
- 多核并行计算
- 动态输入
- 执行速度
- 异常处理
- Docker
- Blockchain
- 大数据、通用数据接口
- 人工智能
- 数字孪生硬件相关
-
- kinectgames
- hakell分形。自动计算
- 计算机进化,计算-自然进化Hakell
- 状态自动机
- haskell游戏编程框架
- Andriod
-
- Andrios APP
- Andrios APP IOS
- java V.S Haskell更高效有用OOP抽象-面向函数对象hakell
-
- JAVA VS Haskell
- 用Haskell实现面向对象编程OOP
-
- JVM
- lambda硬件电路编程语言
-
- “λ演算芯片”?
-
- 《From Haskell to Hardware via CCCs》
- ForSyDe
- Atom
- Circuit Simulator电路模拟器Hawk项目
- chortl
- CλaSH(clas)功能性硬件描述语言
- 函数式高并发操作系统
-
- Haskell_GUI
- hakell程序设计编译发行exe等
- I/O标准输入输出
- 大一统的出路---Haskell胶水实现
-
- 编程语言通过胶水链接OS接口实现大一统。
- 调用其他软件的接口api
- Haskell-API
-
- python
- R
- ML
- C,DLL
- 文末总结+我想到的优点:
- **别人认为的优点:**
-
- Haskell有一些问题类型可以擅长,但是,
- haskell缺点
- 很多时候,决定脑袋能想到什么的是人们看到了什么。
陆陆续续接触λ演算,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 Remorse
succinct data structure 得看 ekmett 的 talk 和库,ekmett 所以库相关的都推荐 越列越多, 都看得过来吗?
编辑于 2019-03-09
Haskell在工业界有哪些实际的应用?
感觉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的一些思考
我甚至曾经冲动地认为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更加抽象更加泛型,更加数学,可用范围更广!
抽象的魅力!
更接近大脑思考!
同样是a higher level of abstraction轮子封装。
**模块化程序设计,软件工程,项目管理,不断降低复杂度,把已经写好的难题麻烦包装起来。
**
学习学的是造轮子的思路想法启发,知识创造的来龙去脉从零建立来自己心中的知识高楼,而不是背默下来琐碎的知识点,舍本逐末。 Haskell没有JAVA那么蹩脚,C语言基石,C++拿来主义什么都往上加丰富过分单调的C,各种子函数兼容成面向对象,然后C+++±-简化成JAVA,JVM跨平台和网络的顺风车让他大火,接着发现同样是实现继承,多态,重载,重写和递归方法调用,单继承还行,多继承接口实现。JAVA蹩脚同时各种戴着镣铐跳舞的奇淫怪技,限制太多,现在行业JAVA的正确风气应该是提供接口这种正确的抽象而不是闭嘴硬是要继承带来各种限制。 但是,最适合跨平台网络编程那年JAVA火了,最适合GUI的面向对象火了。 如何看待Erlang之父Joe Armlabel觉得OO编程很烂? - 大宽宽的回答 - 知乎 https://www.zhihu.com/question/29888990/answer/703226836
世界运作的规律的更加高明的现实建模的抽象万花筒,就是编程语言百态的根本原因
- 子函数模块化封装成OOP 现在应该倡导的是“接口”种种类似manoid
- 函数嵌套调用封装Haskell的单子函子,curry传参数,更加高明,泛函,抽象,底层
强类型,类型类,kind,type ,typeclass------更泛型,类型类,近世代数,范畴------>研究世界的数学抽象方式。
世界运作的规律是:数学家演算纸上符号,物理学家的公式模型,计算机上仿真模拟的编程实物演算(机械时代用机械结构,电气时代用电子晶体管,没差了,知乎下“纯机械时代巅峰”),所有学科所有人都在做一件事“洞悉世界运作的规律”,它是
- Ctrl+CV的lambda演算复读机本性
- 兔子细胞繁殖半衰期Fibonacci,数列穷举法的指数增长,阶乘增长函数,整数之间除法必然遇到的素数相关“数学皇后数论”的问题
- 是高维俯瞰的复数,4元数,时间维相对论
- 是不断重复自己的分形,
- 是精美绝伦的对称,杨振宁口中的21世纪的对称,物理对称和不动点的关系------那位女科学家
- 是泛函找最小作用量的最优化,是量子光学,量子电动学等最优化的计算 7.是统计机器学习找规律的近似,近似是很有效的物理研究思想
- 是各种群,范畴,矩阵,函数,算子等等变换下不变量,守恒量,特征根函数不动点
- 是离散和连续,量子化和数学极限,集合论和无穷维线性代数(量子力学用到),
- 是场论,是图论,是复分析可视化,
- 是状态时序电路的有限状态直接不断跳转的“自动机”
- 是逻辑电路,Haskell给定输入有确定输出的输出的纯函数
- 是机械仿真,电子仿真,系统工程仿真模拟
- 是Taylor展开机械控制的线性化处理近似,是傅里叶拉普拉斯的信号处理
- 是编码理论通信鼻祖的,信号论,信息熵编码理论香农大大,信号处理奥本海默牛人
- 是对称调用自己,递归(子集循环)的无脑重复,代码复用下的自然。
- 是曲率纤维丛研究下的空间
- 是拓扑研究中的不变量
- 是声振动模态,光电量子电磁场动力学,热振动热能,力牛顿时代形象生动的描述。
- 是不同研究模式下的不同范式
- …
{– 尽管牛顿自己也没有说过力这种抽象,《原理》定义的是动量,导数关系导出的元素只是研究对象,不是最本质的定义实际意义的量,或者根本没有所谓最本质的东西,场论如果物质分布电磁场变成物质那么梯度,旋度,导数就是想要的东西了。这一切都只是符合现实的规律二律背反的 建模方式,并不知道那个是对的,或者都对,都是“冥冥中的世界运作的规律的抽象近似模型”,谁的描述方法更加精准形象就用谁的。 科学就是要自洽,严谨,满足客观实验规律,能用来指导生产生活才能被成为科学,而不是谬论。 –}
对于编程语言,我的观点觉得:没人关心你到底用的什么语言写的程序代码,用户只关心稳定,安全好用。老板只关心开发周期,开发成本,项目管理计划于安排。甚至连写代码的人都不关心这个语言还是那个语言,只要有好的知识轮子可以用,就是好语言。为了做出好的轮子,我们都不得不认真比较,毕竟每种编程语言就像每个学科不同的研究建模数学表达方式,都是为了一个目的“世界运作的数学原理”。 我感觉Haskell有着很多优点是其他语言赶不上的,而且,我觉得更重要的不是各种语言,而是定义一种所有语言通用的DLL,LIB,OLE之类的跨平台的所有编程语言都能进行交互,互相调用的“操作系统接口–协议–调用方法—或者说是约定”,具体说来就是一种通用的数据格式,代码模块化格式,方便各种语言互相调用(就像是数学方言之间的相互翻译和等价证明),Haskell最美的地方大概就是和数学接近吧!
如果所有编程语言都能通过“Haskell”作为桥梁接口连接沟通,而Haskell又能与数学语言翻译的话,那么,描述世界运作的“自然哲学里面的数学原理”就能通过Haskell完美诠释,以后数学书上那些公式就能很方便地编程计算机上的代码,用光速仿真模拟世界运作的规律!
Haskell,你就是话题之王?
数据结构算法,体系结构数值运算,操作系统算法,编译原理语法语义上下文无关,组合数学,离散数学,范畴学,图论,运筹学最优化仿真,统计机器学习,自然演化算法,lamnda演算相关+github编程论文项目,数值积分,逻辑数学异或,《数学与泛型编程》小蓝书…
很久我才明白一个道理:其实不必什么事情都一个人研究明白细节,因为Haskell研究科学,甚至可以说包括的不止上述信息。
只要学懂了,会发现,这一切科学发展思路基石都统一于研究一件事“世界运作的规律”
我做过调度算法,语法语义相关理解一些,但是编译原理还是没学明白!
难受!!做不出知识轮子,不能创造举一反三就是没学会!只会重复已经有的知识只是在耍流氓复读机,根本不是前赴后继前任肩膀上前行的真正的科学应该有的样子!!
注意,下列文章例子项目只是恰巧看到的距离或者常见的引导链接,实际上我觉得信息爆炸的互联网比起来,下面的范围连个粗浅的简要目录都算不上,
但是
[注] 下列标题中文,翻译成英文,不一定就是相关正确的术语搜索关键词,找准方向,深入了解,记得找准英文关键词。
[注] 下列链接只是为了说明Haskell的波澜壮阔,实际上互联网是很宽广的大海!
曾经,我有过一个想法,如果全世界的人共同维护一颗知识笔记书,让索引变得方便,共同编译一份项目,分好类,做好索引分享的话,很多前任走过的坑后人就不会再无效信息或者过期信息间不断跳转了,我本来还想做个项目,后来发现everything之类的项目,类似的我觉得不需要新建,跟着完善也不错,比如共同编辑的维基索引,领域相关的博客论坛社区,https://wiki.haskell.org/Haskell
喜欢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.
DSL领域编程
##用haskell单子优势处理JSON,XML,字符串,websocket,HTTP,序列化,Protobuf,MessagePack,网页模板编程,或者生成SQL,parser解析器…
Haskell处理XML https://blog.csdn.net/kowity/article/details/8134477
DSL编译原理翻译其他语言,语法解析器+模板编程+泛型编程
应用例子 http://www.aqee.net/post/why-haskell-is-worth-learning.html
模板template编程
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
解析器paser
optparse-applicative命令行参数解析器函数库
https://hackage.haskell.org/package/optparse-applicative
Haskell LLVM JIT Compiler Tutorial
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
语言扩展和程序标记ghc表一编译相关技巧
{-#…#-}
{-#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
Regex/文本处理/自然语言处理NLP
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
latex文本处理
https://github.com/Daniel-Diaz/HaTeX
https://github.com/batterseapower/charsetdetect
快熬出头的Haskell大前端
适合吗?网络编程优缺点
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编程
serialize序列化/反序列化与泛型编程
序列化/反序列化,把内存中“活”数据<->传输/存储序列化格式JSON,MessagePack,Protobuf…
重复代码很多解决办法:
- 模板编程
- 泛型编程
aeson函数库
模板自动生成ToJSON/FromeJSON
泛型自动生成ToJSON/FromeJSON
泛型编程
attoparsec函数库
protobuf函数库
React App etc.Big Web Products
reanimate
A demo web browser engine
https://github.com/elginer/shpider
https://github.com/chrisdone/vado
The intent is to develop a high quality, high level driver similar to pycassa.
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
WSAM
https://github.com/haskell-wasm/wasm
https://github.com/mattgodbolt/compiler-explorer
Haskell WebAssembly Toolkit https://github.com/SPY/haskell-wasm
NetASM
https://github.com/NetASM/NetASM-haskell
https://github.com/HaskellCNOrg/snap-web
canvas
https://github.com/ku-fpg/blank-canvas
port
https://github.com/laserpants/hashids-haskell
GRPC
https://github.com/awakesecurity/gRPC-haskell/blob/master/examples/tutorial/TUTORIAL.md
https://github.com/jaspervdj/hakyll
CSS
https://github.com/sebastiaanvisser/clay
DNS
https://github.com/kazu-yamamoto/dns
Fast Haskell XML parser
https://github.com/ocramz/xeno
OpenSSL binding for Haskell
https://github.com/depressed-pho/HsOpenSSL
SSL
https://github.com/dpwright/HaskellNet-SSL
http
https://github.com/haskell/HTTP
Amazon Web Services for Haskell
https://github.com/aristidb/aws
YAML
https://github.com/dhall-lang/dhall-haskell
JSON文本处理
https://github.com/bos/aeson
Apache
https://github.com/tweag/sparkle
数据库
HDBC
postgresql-simple,mysql-simple,sqlite-simple
persistent
groundhog
esqueleto:比如DSL书写SQL的好处
opaleye
SQL
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
hakell计算效率
数值计算领域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
haskell-optimization
https://github.com/frizensami/haskell-optimization
大数计算
https://github.com/erikd/haskell-big-integer-experiment
命题逻辑,一阶逻辑,形式验证,定理证明,数学猜想
其实我觉得λ演算很适合做这个的。
Haskell bindings to Microsoft’s Z3 API (unofficial).
https://github.com/IagoAbal/haskell-z3
hakell符号演算定理证明coq
高数线性代数 proof of hakell symbolic calculus theorem Linear algebra of higher numbers
https://github.com/jwiegley/coq-haskell
https://zhuanlan.zhihu.com/p/31567423
Haskell保存公理公式和运算,实现证明高数书本的过程!!
!!翻译,一个高校计算机演算数学公式的过程!
机器数学证明,把求导积分微分等等放进去操作的约定,人不推导公式,人用它来发现新的公式! 机器几何证明!
Haskell程序证明
https://zhiwei.li/text/2010/06/10/haskell程序推理/
Convert Haskell source code to Coq source code
https://github.com/antalsz/hs-to-coq
Prolog
用Haskell编写的prolog解释器。 https://github.com/Erdwolf/prolog
hakell Paser语义语法分析—编译原理
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/
Haskell的LEX和YACC
性能比 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 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如何评价Haskell的Parser Generator BNFC?
它是不是直接解决了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统计学习Jullia,Python接口调用通用Manod
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
何时Haskell比数据科学中的R或Python更有用?
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
好玩的CAD/CAE
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
Hackage上视频框架,图像处理框架
gloss就不错,还有很多,一搜就有。
reanimate- Animation library based on SVGs-
建模,计算机辅助设计CAD
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
MusicPlayer+GIF
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/
FFmeg
Minimal Haskell bindings to the FFmpeg library
https://github.com/acowley/ffmpeg-light
MIDI
https://github.com/5outh/Bang
可视化
https://github.com/viskell/viskell
Viskell是一种用于类型(类似Haskell)的函数式编程语言的实验性可视化编程环境。该项目正在探索交互式可视化编程的可能性和挑战,并结合功能语言的优点和缺点。
OpenCV
https://github.com/LumiGuide/haskell-opencv
openCL
https://github.com/bgaster/hopencl
OpenGL
https://github.com/hasura/graphql-parser-hs
https://github.com/madjestic/Haskell-OpenGL-Tutorial https://github.com/bergey/haskell-OpenGL-examples
OpenQL
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
QuickCheck
https://github.com/CIFASIS/QuickFuzz
概率编程
https://github.com/adscib/monad-bayes
RSA加密
https://github.com/GaloisInc/RSA