关于 Haskell 有很多炒作,但是,很难获得有关如何在现实世界应用程序中使用它的信息。 Haskell 最流行的项目/用法是什么?为什么它擅长解决这些问题?
这有哪些常见用途
语言?
快速的应用程序开发。
如果你想知道“为什么 Haskell?”,那么你需要考虑函数式编程语言的优点(摘自https://c2.com/cgi/wiki?函数式编程的优点 https://c2.com/cgi/wiki?AdvantagesOfFunctionalProgramming):
函数式程序往往比命令式语言程序简洁得多。通常这会导致增强
程序员生产力
FP 鼓励快速原型设计。因此,我认为这是 ExtremeProgrammers 的最佳软件设计范例......但我知道什么?
FP 在功能维度上是模块化的,而面向对象编程在不同维度上是模块化的
成分。
鱼与熊掌兼得的能力。想象一下你有一个复杂的面向对象系统处理消息 - 每个组件都可能创建状态
根据消息进行更改,然后将消息转发给某些人
它有链接的对象。这不是太酷了吗?
如果某个对象深入调用,则可以轻松回滚每个更改
层次结构决定消息有缺陷吗?拥有以下历史怎么样
不同的州?
许多内务管理任务为您准备:解构数据结构(PatternMatching)、存储变量绑定(LexicalScope 和
闭包)、强类型(TypeInference)、GarbageCollection、存储
分配,是否使用装箱(指向值的指针)或未装箱(值
直接)表示...
安全多线程!不可变数据结构不受数据竞争条件的影响,因此不必受到保护
锁。如果您总是分配新对象,而不是
破坏性地操纵现有的,锁定可以隐藏在
分配和垃圾收集系统。
除此之外,Haskell 还有其自身的优点,例如:
- 受数学符号启发的清晰、直观的语法。
- 列表推导式用于根据现有列表创建列表。
- Lambda 表达式:创建函数而不给它们明确的名称。因此处理大公式更容易。
- 哈斯克尔完全是参照透明 https://wiki.haskell.org/Referential_transparency。任何使用 I/O 的代码都必须如此标记。这样,它鼓励您将有副作用的代码(例如,在屏幕上放置文本)与没有副作用的代码(计算)分开。
- Lazy evaluation is a really nice feature:
- 即使某些事情通常会导致错误,只要您不使用结果,它仍然可以工作。例如,您可以将
1 / 0
作为列表的第一项,如果您只使用第二项,它仍然可以工作。
- 编写这样的搜索程序更容易数独求解器 https://web.archive.org/web/20130823222012/http://www.cs.tufts.edu/~nr/comp150fp/archive/richard-bird/sudoku.pdf因为它不会立即加载每个组合 - 它只是在运行过程中生成它们。你可以用其他语言做到这一点,但只有 Haskell 做到这一点默认情况下.
您可以查看以下链接:
- https://c2.com/cgi/wiki?函数式编程的优点 https://c2.com/cgi/wiki?AdvantagesOfFunctionalProgramming
- https://learn.microsoft.com/archive/blogs/wesdyer/why-function-programming-is-important-in-a-mixed-environment https://learn.microsoft.com/archive/blogs/wesdyer/why-functional-programming-is-important-in-a-mixed-environment
- https://web.archive.org/web/20160626145828/http://blog.kickino.org/archives/2007/05/22/T22_34_16/ https://web.archive.org/web/20160626145828/http://blog.kickino.org/archives/2007/05/22/T22_34_16/
- https://useless-factor.blogspot.com/2007/05/advantage-of-function-programming.html https://useless-factor.blogspot.com/2007/05/advantage-of-functional-programming.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)