Haskell /ˈhæskəl/[1] 是一种静态类型的纯函数式编程语言,具有类型推断和惰性计算。[2] Haskell开创了许多高级编程语言功能,例如类型类,它支持类型安全运算符重载。[3] Haskell的主要实现是格拉斯哥哈斯克尔编译器。它以逻辑学家哈斯克尔·库里的名字命名。
Haskell是基于Miranda编程语言的语义,而不是语法,这是Haskell最初工作小组的工作重点。[4] Haskell广泛应用于学术界[5][6] 和工业界。[7] Haskell的最新标准是Haskell2010。截至2016年5月,Haskell委员会正在研究下一个标准,Haskell2020。[8]
随着Miranda在1985年被Research Software有限公司发布,人们对惰性函数式语言越来越感兴趣。到1987年,已经有十几种非严格的纯函数编程语言存在。Miranda是使用最广泛的,但它是专有软件。在俄勒冈波特兰举行的函数式编程语言和计算机体系结构会议(FPCA '87)上,与会者达成了一个强烈的共识,即成立一个委员会来定义这类语言的开放标准。委员会的目的是将现有的函数式语言合并成一种通用语言,作为未来函数式语言设计研究的基础。[9]
Haskell的第一个版本(“Haskell1.0”)是在1990年定义的。[10] 委员会的努力产生了一系列语言定义(1.0、1.1、1.2、1.3、1.4)。
1997年末,该系列以Haskell98为高潮,旨在指定一个稳定的、最小的、可移植的语言版本和一个附带的教学标准库,并作为未来扩展的基础。委员会明确欢迎通过添加和合并实验特性来创建Haskell 98的扩展和变体。[9]
1999年2月,Haskell98语言标准最初作为《Haskell98报告》出版。[9] 2003年1月,修订版《Haskell98语言和库:修订报告》出版。[10] Haskell语言继续快速发展,格拉斯哥哈斯克尔编译器(GHC)的实现代表了当前事实上的标准。[10]
2006年初,Haskell 98标准的后续标准(非正式名称为Haskell Prime,)的定义过程开始了。[11] 这是修订语言定义的持续渐进过程,每年最多产生一次新的修订。第一次修订名为Haskell 2010,于2009年11月在公布[12] 并于2010年7月出版。
Haskell 2010是对该语言的一个增量更新,主要包含了以前通过编译器特定标志启用的几个使用良好且无争议的特性。
Haskell的特点是惰性计算、lambda表达式、模式匹配、列表理解、类型类和类型多态性。这是一种纯粹的函数式语言,这意味着函数通常没有副作用。存在一种不同的结构来表示副作用,与函数类型正交。纯函数可以返回随后执行的副作用,模拟其他语言的非纯函数。
Haskell有一个基于亨德利-米尔纳类型推论的静态强类型系统。它在这一领域的主要创新是类型类,最初被认为是增加语言重载的一种原则性方法,[13] 但后来发现了更多的用途。[14]
单子是代表副作用的结构的一个例子。单子是一个通用框架,可以模拟不同类型的计算,包括错误处理、非确定性、解析和软件事务性内存。单子被定义为普通的数据类型,但是Haskell为它们的使用提供了一些语法糖。
Haskell有一个公开的、已发布的规范,[15] 并且存在多种实现。它的主要实现是格拉斯哥哈斯克尔编译器(GHC),它既是一个解释器,也是运行在大多数平台上的本机代码编译器。GHC以其丰富的类型系统而闻名,该系统结合了最近的创新,如广义代数数据类型和类型族。计算机语言基准测试游戏也强调了它对并发性和并行性的高性能实现。[15]
围绕该语言存在一个活跃的、不断发展的社区,在线软件包库Hackage中有5400多个第三方开源库和工具。[16]
Haskell的“Hello,world”程序(只需最后一行):
module Main (main) where -- not needed in interpreter, is the default in a module file
main :: IO () -- the compiler can infer this type definition
main = putStrLn "Hello, World!"
Haskell中的阶乘函数,用几种不同的方法定义:
-- Type annotation (optional, same for each implementation)
factorial :: (Integral a) => a -> a
-- Using recursion (with the "ifthenelse" expression)
factorial n = if n < 2
then 1
else n * factorial (n - 1)
-- Using recursion (with pattern matching)
factorial 0 = 1
factorial n = n * factorial (n - 1)
-- Using recursion (with guards)
factorial n
| n < 2 = 1
| otherwise = n * factorial (n - 1)
-- Using a list and the "product" function
factorial n = product [1..n]
-- Using fold (implements "product")
factorial n = foldl (*) 1 [1..n]
-- Point-free style
factorial = foldr (*) 1 . enumFromTo 1
由于整数类型具有任意精度,该代码将计算factorial 100000 (456,574位数)等值,而不会损失精度。
一种类似于列表快速排序的算法的实现,其中第一个元素作为枢纽:
-- Type annotation (optional, same for each implementation)
quickSort :: Ord a => [a] -> [a]
-- Using list comprehensions
quickSort [] = [] -- The empty list is already sorted
quickSort (x:xs) = quickSort [a | a <- xs, a < x] -- Sort the left part of the list
++ [x] ++ -- Insert pivot between two sorted parts
quickSort [a | a <- xs, a >= x] -- Sort the right part of the list
-- Using filter
quickSort [] = []
quickSort (x:xs) = quickSort (filter (<x) xs)
++ [x] ++
quickSort (filter (>=x) xs)
本页顶部的Haskell标志是由Haskell代码生成的。[17]
所有列出的实现都在开源许可证下分发。[18]
完全或几乎符合Haskell98标准的实现包括:
不再积极维护的实现包括:
实现不完全符合Haskell 98标准,并且使用不同的Haskell语言,包括:
Haskell网络框架已经存在,[34] 包括:
2002年的简·威廉·梅森和2003年的西蒙·佩顿·琼斯讨论了与惰性计算相关的问题,同时也承认惰性计算的理论动机。[36][37] 除了纯粹的实际考虑,如提高性能,[38] 他们指出,除了增加一些性能开销,惰性计算使程序员更难对代码的性能(尤其是空间使用)进行推理。
巴斯夏安·希伦、金奎大·莱金和阿尔扬·范伊泽多姆在2003年也观察到Haskell学习者的一些绊脚石:“Haskell微妙的语法和复杂的类型系统是一把双刃剑——既受到经验丰富的程序员的高度赞赏,但也是初学者沮丧的根源,因为Haskell的普遍性经常导致神秘的错误信息。”[39] 为了解决这些问题,乌得勒支大学的研究人员开发了一种叫做Helium的高级解释器,它通过限制Haskell特性的通用性,特别是取消对类型类的支持,提高了错误信息的用户友好性。
本·李普梅尔(Ben Lippmeier)设计Disciple[40] 作为Haskell的一种带有类型和效果系统的严格默认(显式注释惰性)方言,以解决Haskell在推理惰性计算和使用可变数组等传统数据结构方面的困难。[41] 他认为 “破坏性更新为程序员提供了两个重要而强大的工具...一组高效的类似数组的数据结构,用于管理对象集合,以及...在给程序员带来最小负担的情况下,向程序的所有部分广播新值的能力。"
标准元语言的作者之一罗伯特·哈珀给出了他不使用Haskell教授入门编程的理由。其中包括难以用非严格的评估来推理资源使用,惰性计算使数据类型和归纳推理的定义复杂化,以及哈斯克尔(旧)类系统相对于元语言的模块系统的“劣势”。[42]
由于默认构建工具Cabal对同一库的不同版本缺乏良好的管理,它一直受到开发人员的批评。管理Cabal的Stack的发布解决[43] 了在编译中的工作。
Clean是Haskell的近亲,年龄稍大。它与Haskell最大的不同之处在于使用了唯一性类型,而不是用于输入输出和副作用的单子。
Haskell启发了一系列不同类型系统的语言,包括:
基于Java虚拟机的:
其他相关语言包括:
Haskell已经成为语言设计中许多新想法的试验平台。Haskell产生了许多变体,探索新的语言思想,包括:
^Chevalier, Tim (28 January 2008). "anybody can tell me the pronunciation of "haskell"?". Haskell-cafe (Mailing list). Retrieved 12 March 2011..
^Type inference originally using Hindley-Milner type inference.
^"Type classes, first proposed during the design of the Haskell programming language, ..." —John Garrett Morris (2013), "Type Classes and Instance Chains: A Relational Approach".
^Edward Kmett, Edward Kmett - Type Classes vs. the World.
^"Haskell in education". Retrieved 15 February 2016..
^"Haskell in research". Retrieved 15 February 2016..
^"Haskell in industry". Retrieved 15 February 2016..
^https://web.archive.org/web/20221025122239/https://mail.haskell.org/pipermail/haskell-prime/2016-April/004050.html.
^Peyton Jones 2003, Preface..
^Hudak et al. 2007..
^"Welcome to Haskell'". The Haskell' Wiki..
^Marlow, Simon (24 November 2009). "Announcing Haskell 2010". Haskell (Mailing list). Retrieved 12 March 2011..
^Wadler, P.; Blott, S. (1989). "How to make ad-hoc polymorphism less ad hoc". Proceedings of the 16th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages. ACM: 60–76. doi:10.1145/75277.75283. ISBN 978-0-89791-294-5..
^Hallgren, T. (January 2001). "Fun with Functional Dependencies, or Types as Values in Static Computations in Haskell". Proceedings of the Joint CS/CE Winter Meeting. Varberg, Sweden..
^Peyton Jones 2003..
^"HackageDB statistics". Hackage.haskell.org. Archived from the original on 2013-05-03. Retrieved 2013-06-26..
^Haskell.org, Thompson-Wheeler logo in Haskell. (2010) The public domain Haskell script which generates .svg of this logo. The logo is a monad bind (>>=) overlaid by a lambda (λ)..
^"Implementations" at the Haskell Wiki.
^"The LLVM Backend". GHC Trac..
^Terei, David A.; Chakravarty, Manuel M. T. (2010). "An LLVM Backend for GHC". Proceedings of ACM SIGPLAN Haskell Symposium 2010. ACM Press..
^C. Ryder and S. Thompson (2005). "Porting HaRe to the GHC API".
^Utrecht Haskell Compiler.
^Boquist, Urban; Johnsson, Thomas (1996). "The GRIN Project: A Highly Optimising Back End for Lazy Functional Languages". LNCS. 1268: 58–84..
^Hudak et al. 2007, p. 12-22..
^"The Haskell Cabal". Retrieved 8 April 2015..
^"Linspire/Freespire Core OS Team and Haskell". Debian Haskell mailing list. May 2006..
^xmonad.org.
^Shake Build System.
^ShellCheck.
^Metz, Cade (September 1, 2015). "Facebook's New Spam-Killer Hints at the Future of Coding". Wired. Retrieved September 1, 2015..
^Simon Marlow (2014), Open-sourcing Haxl.
^Swift-Nav (2018).
^A formal proof of functional correctness was completed in 2009. Klein, Gerwin; Elphinstone, Kevin; Heiser, Gernot; Andronick, June; Cock, David; Derrin, Philip; Elkaduwe, Dhammika; Engelhardt, Kai; Kolanski, Rafal; Norrish, Michael; Sewell, Thomas; Tuch, Harvey; Winwood, Simon (October 2009). "seL4: Formal verification of an OS kernel" (PDF). 22nd ACM Symposium on Operating System Principles. Big Sky, MT, USA..
^"Web/Frameworks"..
^"Snap: A Haskell Web Framework: Home". Snapframework.com. Retrieved 2013-06-26..
^Jan-Willem Maessen. Eager Haskell: Resource-bounded execution yields efficient iteration. Proceedings of the 2002 Association for Computing Machinery (ACM) SIGPLAN workshop on Haskell..
^Simon Peyton Jones. Wearing the hair shirt: a retrospective on Haskell. Invited talk at POPL 2003..
^"Lazy evaluation can lead to excellent performance, such as in The Computer Language Benchmarks Game"..
^Heeren, Bastiaan; Leijen, Daan; van IJzendoorn, Arjan (2003). "Helium, for learning Haskell" (PDF). Proceedings of the 2003 ACM SIGPLAN Workshop on Haskell..
^"DDC – HaskellWiki". Haskell.org. 2010-12-03. Retrieved 2013-06-26..
^Ben Lippmeier, Type Inference and Optimisation for an Impure World, Australian National University (2010) PhD thesis, chapter 1.
^Robert Harper. "Modules matter most"..
^Haskell Communities and Activities Report, 32nd ed. May 2017, p. 17: Stack Build Tool, January 2015.
^"Frege Programming Language"..
^"Google Code Archive - Long-term storage for Google Code Project Hosting"..
^Marimuthu Madasamy (2012-02-29). "mmhelloworld"..
^"Codehaus". Archived from the original on 20 February 2006..
^"Glasgow Parallel Haskell"..
^"7.15. Parallel Haskell"..
^"4.12. Using SMP parallelism"..
^Todd Allen Amicon. "Computation Structures Group- MIT- LCS"..
^"O'Haskell"..
^"Hackathon – HaskellWiki"..
暂无