haskell - Haskell 有什么大惊小怪的?

标签 haskell functional-programming

我认识一些程序员,他们在一起时一直在谈论 Haskell,所以每个人似乎都喜欢这种语言。擅长 Haskell 似乎有点像天才程序员的标志。

有人可以举几个 Haskell 的例子来说明为什么它如此优雅/优越吗?

最佳答案

这是说服我学习 Haskell 的例子(我很高兴我做到了)。

-- program to copy a file --
import System.Environment

main = do
         --read command-line arguments
         [file1, file2] <- getArgs

         --copy file contents
         str <- readFile file1
         writeFile file2 str

好的,这是一个简短、可读的程序。从这个意义上说,它比 C 程序更好。但这与(比如说)结构非常相似的 Python 程序有何不同?

答案是惰性评估。在大多数语言(甚至是一些函数式语言)中,类似于上述结构的程序将导致整个文件被加载到内存中,然后以新名称再次写出。

Haskell 很“懒”。它不会在需要时计算事物,并且通过扩展不会计算它永远不需要的事物。例如,如果您要删除 writeFile 行,Haskell 不会首先从文件中读取任何内容。

事实上,Haskell 认识到 writeFile 依赖于 readFile,因此能够优化此数据路径。

虽然结果取决于编译器,但运行上述程序时通常会发生以下情况:程序读取第一个文件的一个 block (例如 8KB),然后将其写入第二个文件,然后读取另一个 block 从第一个文件,并将其写入第二个文件,依此类推。 (尝试在其上运行 strace!)

...这看起来很像文件复制的高效 C 实现的功能。

因此,Haskell 可以让您编写紧凑、可读的程序 - 通常不会牺牲大量性能。

我必须补充的另一件事是 Haskell 使得编写有错误的程序变得困难。令人惊叹的类型系统、无副作用,当然还有 Haskell 代码的紧凑性,至少出于以下三个原因减少了错误:

  1. 更好的程序设计。降低复杂性可以减少逻辑错误。

  2. 紧凑的代码。存在错误的行数更少。

  3. 编译错误。很多错误都不是有效的 Haskell

Haskell 并不适合所有人。但每个人都应该尝试一下。

关于haskell - Haskell 有什么大惊小怪的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/775726/

相关文章:

compiler-errors - 显示为无法识别的类型类

haskell - 无法将预期类型 `Text' 与实际类型 `[Char]' 匹配

haskell - 为什么这个 Traversable for list 实例不正确?

functional-programming - Lisp - 逻辑运算符

python - 是否可以仅使用 map 实现过滤功能?

scala - 如何对 Set[ValidatedNel[String, Double]] 求和?

functional-programming - OCaml - 模式匹配与元组中的列表引用

list - 元组搜索的 Haskell 列表

opengl - 使用基于递归的动画时在 drawPicture "Gloss/OpenGL Stack Overflow "之后出现错误 .""

haskell - `a :~: b` 和 `(a :== b) :~: True` 之间有什么联系吗?