首页 >
Haskell
✍ dations ◷ 2025-02-23 03:29:35 #Haskell
Haskell(发音为/ˈhæskəl/)是一种标准化的,通用的纯函数编程语言,有非限定性语义和强静态类型。它的命名源自美国逻辑学家哈斯凯尔·加里,他在数理逻辑方面上的工作使得函数式编程语言有了广泛的基础。在Haskell中,“函数是第一类对象”。作为一门函数编程语言,主要控制结构是函数。Haskell语言是1990年在编程语言Miranda的基础上标准化的,并且以λ演算为基础发展而来。这也是为什么Haskell语言以希腊字母“λ”(Lambda)作为自己的标志。Haskell具有“证明即程序、命题为类型”的特征。1985年,Miranda发行后,惰性函数式语言的关注度增长。到1987年前,出现了十多种非限定性、纯函数式语言。其中,Miranda使用的最为广泛,但还没有出现在公共领域。在俄勒冈波特兰的函数式编程语言与计算机结构大会(FPCA '87)上,参加者一致同意形成一个委员会来为这样的语言定义一种开放性标准。该委员会旨在集成已有函数式语言,作为将来的函数式语言设计研究工作的基础。1990年定义了Haskell的第一个版本(“Haskell 1.0”)。委员会形成了一系列的语言定义(1.0,1.1,1.2,1.3,1.4)。1997年底,该系列形成了Haskell 98,旨在定义一个稳定、最小化、可移植的语言版本以及相应的标准库,以用于教学和作为将来扩展的基础。委员会明确欢迎创建各种增加或集成实验性特性的Haskell 98的扩展和变种。1999年2月,Haskell 98语言标准公布,名为《The Haskell 98 Report》。2003年1月,《Haskell 98 Language and Libraries: The Revised Report》公布。接着,Glasgow Haskell Compiler (GHC)(英语:Glasgow Haskell Compiler)实现了当时的事实标准,Haskell快速发展。2006年早期,开始了定义Haskell 98标准后续的进程,非正式命名为Haskell Prime。这是个修订语言定义的不断增补的过程,每年产生一个新的修订版。第一个修订版于2009年11月完成、2010年7月发布,称作Haskell 2010。Haskell 2010加入了外部函数接口(Foreign Function Interface(英语:Foreign Function Interface),FFI)允许绑定到其它编程语言,修正了一些语法问题(在正式语法中的改动)并废除了称为“n加k模式”(换言之,不再允许形如fact (n+1) = (n+1) * fact n的定义)。引入了语言级编译选项语法扩展(Language-Pragma-Syntax-Extension),使得在Haskell源代码中可以明确要求一些扩展功能。Haskell 2010引入的这些扩展的名字是DoAndIfThenElse、HierarchicalModules、EmptyDataDeclarations、FixityResolution、ForeignFunctionInterface、LineCommentSyntax、PatternGuards、RelaxedDependencyAnalysis、LanguagePragma、NoNPlusKPatterns。Haskell是现有的一门开放的、已发布标准的,且有多种实现的语言。支持惰性求值、模式匹配、列表解析、类型类和类型多态。它是一门纯函数编程语言,这意味着大体上,Haskell中的函数没有副作用。Haskell用特定的类型来表达副作用,该类型与函数类型相互独立。纯函数可以操作并返回可执行的副作用的类型,但不能够执行它们,只有用于表达副作用的类型才能执行这些副作用,Haskell以此表达其它语言中的非纯函数。Haskell拥有一个基于Hindley-Milner类型推论的静态、强类型系统。Haskell在此领域的主要创新就是加入了类型类(type class),原本设想作为重载的主要方式,在之后发现了更多用途。Haskell的主要实现GHC(英语:Glasgow Haskell Compiler)是个解释器,也是个原生代码编译器。它可以在大多数平台运行,GHC在并发和并行上具有高性能的实现能力,也有丰富的类型系统,如广义代数数据类型和类型族(Type Families)。单子是一个抽象类型,可以表达不同种类的计算,包括异常处理、非确定性、语法分析以及软件事务内存,其中一个应用是用于表达副作用的类型。单子定义为普通的数据类型,同时Haskell也为其提供了几种语法糖。Haskell有一个活跃的社区,在线上包仓库Hackage上有丰富的第三方开源库或工具。Haskell是强类型语言。
Char的字面值用单引号围起;
字符串即类型,其字面值用双引号括起来。
Int通常为32位整型
Integer是无界整型
Float 表示单精度的浮点数
Double 表示双精度的浮点数
Bool 只有两种值:True 和 False。使用与逗号分隔符,定义一个list的实例。其元素必须具有相同类型。字符串是list的特例。用:把元素与list、其他元素连接(cons)起来。:是右结合的运算符。 实际上是 1:2:3: 的语法糖。两个 List 合并通过 ++ 运算符实现。按照索引获取 List 中的元素,可以使用 !! 运算符,索引的下标为 0。List 中的 List 可以是不同长度,但必须得是相同的型别。这样的Range方法快捷定义一个List。用法给出了Range的第一、第二、最后一个元素。使用 > 和 >= 可以比较 List 的大小。它会先比较第一个元素,若它们的值相等,则比较下一个,以此类推。List常用的函数:list comprehension是指基于一个List,按照规则产生一个新List,例如:, x*2 >= 12]使用( )与逗号分隔符,定义一个tuple的实例。其元素可以使不同类型,但个数是固定的。Tuple的类型取决于其中项的数目与其各自元素的类型。单元素的 Tuple 被禁止。基本类似于C语言。但使用not表示逻辑非。基本的 Typeclass:if then else是分段函数定义时的语法糖。与C语言不同,要求必须有else部分。类似于C语言分支语句的情形,叫做pattern matching,例子如下:多态类型(Polymorphic types)类似于C++的模板。例如,算术加法:lambda 就是匿名函数。写法是:一个 (因为它看起来像是希腊字母λ),后面是用空格分隔的参数,-> 后面是函数体。通常用括号将括起lambda函数,否则它会占据整个右边部分。例如:(a b -> (a * 30 + 3) / b)可以在 lambda 中使用模式匹配,但无法为一个参数设置多个模式,如 和 (x:xs)并用。使用 lambda 可以更明确地表现出值是个函数,可以用来传递给其他函数作参数。Haskell的所有函数实际上是单参数函数。多参数函数的写法实际上是Curry化的语法糖。即 func a b等价于(func a) bpoint free style (也称作 pointless style) 的函数,即通过柯里化 (Currying)省略掉单参数。例如:中缀运算符可以加括号变为单参数函数。如 (*3) 5 的值为15。 但(-5)表示负值,所以单参数函数需要写为(subtract 5)。中缀运算符 $,可用于改变函数的调用次序,使其右边的表达式先计算出来。这可以减少一对括号使用。例如 f (g (z x)) 与 f $ g $ z x 等价。其定义是:$ 还可以将数据作为函数使用。例如:中缀运算符 . 用于函数的复合,其定义是:提供了处理异常的函数Template:Haskell/Template:Haskell/Template:Haskell/Template:Haskell.输出结果类似于 C++另外一个例子:如果仅有一个错误条件,Template:Haskell 类足够用了,确省是Haskell的 Template:Haskell class. 更复杂的出错处理用Template:Haskell 或Template:Haskell monads, 类似功能可用Template:Haskell。如下是Haskell语言的"Hello world",注意其中除最后一行外皆可省略。如下是阶乘函数的Haskell实现:它将阶乘描述成有一个基本终止情形的递归函数。这跟数学定义中对阶乘的描述很相似。事实上,Haskell中很多的代码的语法与功能都和数学一致。上面的递归函数的第一行是可选的,它描述了这个函数的类型(types)。它可以读作函数fac的类型为整数至整数(function fac has a int-to-int type)。这就是说,它以一个整型为参数,并且返回另一个整型。第二行依赖的模式匹配,是Haskell程序中一个重要的部分。注意函数的参数是用空格分隔而不是在括号中。当函数的参数是0时,它会返回整型1。对于其他的情况则尝试第三行。这是一个递归,它会一直执行只到满足基本的情形。负参数会导致无限递归,一个guard(英语:guard (computing))保证第三行不会执行负参数。"Prelude"是一个类似C中标准库的小函数集合。使用Prelude,并用无指定参数的写法,它可以改成:上面的定义接近于数学中的定义:f = g o h(参见复合函数),这并不是一个对变量赋值的语句。Haskell中可以定义高阶函数(Higher-order Function),既将函数作为一个参数来使用,也可以将函数作为结果输出,例如:这里f就是一个高阶函数,它取一个从Int到Int的函数g作为参数,输出一个从Int到Int的函数。高阶函数的使用在一些情况下将极大的简化代码。
相关
- 缩写缩写(英语:Abbreviation(Abbrev),来自拉丁语 brevis,意为“短”),在语言学里是一种词语或短语的简易形式,又称省略、缩略语、缩写词。缩写大部分时候等同于简称,但它们之间有细微的差
- 亚临床感染亚临床感染是医学里诊断的一个名词,是指人或动物感染了某疾病病原体但是还未表现出此病的病征。例如甲状腺机能低下症,通常验血会有正常的白血球指数,但是异常扩大的甲状腺会分
- 地米斯托克利特米斯托克力(Θεμιστοκλῆς,Themistocles,前525年-前460年)古希腊杰出的政治家、军事家。雅典人。前490年马拉松战役雅典取得胜利后,来自波斯帝国的威胁暂时解除,地米斯
- 埃斯库罗斯埃斯库罗斯(Αισχύλος,前525年-前456年),古希腊悲剧诗人,与索福克勒斯和欧里庇得斯并列为古希腊最伟大的悲剧作家,有“悲剧之父”的美誉。埃斯库罗斯生于希腊阿提卡的埃琉西
- 顺行性遗忘症顺行性遗忘症(英语:Anterograde amnesia)是一种失忆症,与忘记发病前事物的逆行性遗忘症不同,此病病患会遗忘患病后发生的事物。很大程度上来说,人们对于记忆的机理研究得不是很透
- 护理伦理护理伦理学是应用伦理学的分支,是和护理学有关的伦理学。护理伦理学的许多原则和医疗道德相近,例如行善(英语:Beneficence (ethics))、不伤害病人(英语:Primum non nocere)和尊重自
- 非洲板块非洲板块是一个较大的板块,几乎包含整个非洲大陆,向西一至延伸到中大西洋海岭。它是1968年勒皮雄提出的六大板块之一,范围基本没有变动。非洲板块的西界是一个离散边界,形成中大
- 硝酸钾硝酸钾是钾的硝酸盐,为一离子化合物,KNO3的分子量为101.1,成分比例钾占38.67%,氮占13.86%,氧占47.47%,外观为透明无色或白色粉末,无味。潮解性较硝酸钠为低,有冷却刺激盐味。溶于水,
- 火车进站《火车进站》(法语:L'Arrivée d'un train en gare de La Ciotat)是法国卢米埃尔兄弟于1895年拍摄的一部黑白无声短纪录片,于1896年1月25日在巴黎首映。这部50秒的无声电影展现
- 东斯拉夫人主要分布国家: 白俄罗斯、俄罗斯、乌克兰 次要分布国家:东斯拉夫人(白俄罗斯语:Усходнія славяне;俄语:Восточные славяне;乌克兰语:Східні