This is the说服我学习 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 程序有什么不同呢?
答案是惰性评估。在大多数语言(甚至是一些函数式语言)中,类似于上述结构的程序将导致整个文件被加载到内存中,然后以新名称再次写出。
哈斯克尔很“懒”。直到需要时它才会进行计算,并且通过扩展doesn't计算它永远不需要的东西。例如,如果您要删除writeFile
行,Haskell 一开始就不会费心从文件中读取任何内容。
事实上,哈斯克尔意识到writeFile
取决于readFile
,因此能够优化该数据路径。
虽然结果取决于编译器,但运行上述程序时通常会发生以下情况:程序读取第一个文件的一个块(例如 8KB),然后将其写入第二个文件,然后从第一个文件读取另一个块文件,并将其写入第二个文件,依此类推。 (尝试运行strace
on it!)
...这看起来很像文件复制的高效 C 实现的作用。
因此,Haskell 可以让您编写紧凑、可读的程序——通常不会牺牲大量性能。
我必须补充的另一件事是 Haskell 使编写有错误的程序变得困难。令人惊叹的类型系统、无副作用,当然还有 Haskell 代码的紧凑性,至少出于以下三个原因减少了错误:
更好的程序设计。降低复杂性可以减少逻辑错误。
代码紧凑。存在错误的行数更少。
编译错误。只是有很多bug不是有效的 Haskell.
Haskell 并不适合所有人。但每个人都应该尝试一下。