Haskell是什么

一、Haskell是什么

Haskell(发音为/ˈhæskəl/)是一种标准化的,通用的纯函数编程语言,有非限定性语义和强静态类型。它的命名源自美国逻辑学家哈斯凯尔·加里,他在数理逻辑方面上的工作使得函数式编程语言有了广泛的基础。在Haskell中,“函数是名列前茅类对象”。作为一门函数编程语言,主要控制结构是函数。Haskell语言是1990年在编程语言Miranda的基础上标准化的,并且以λ演算为基础发展而来。这也是为什么Haskell语言以希腊字母“λ”(Lambda)作为自己的标志。Haskell具有“证明即程序、命题为类型”的特征。

二、Haskell特性

Haskell是现有的一门开放的、已发布标准的,且有多种实现的语言。支持惰性求值、模式匹配、列表解析、类型类和类型多态。它是一门纯函数式编程语言,这意味着大体上,Haskell中的函数没有副作用。Haskell用特定的类型来表达副作用,该类型与函数类型相互独立。纯函数可以操作并返回可执行的副作用的类型,但不能够执行它们,只有用于表达副作用的类型才能执行这些副作用,Haskell以此表达其它语言中的非纯函数。

Haskell拥有一个基于Hindley-Milner类型推论的静态、强类型系统。Haskell在此领域的主要创新就是加入了类型类,原本设想作为重载的主要方式,在之后发现了更多用途。

Haskell的主要实现GHC是个解释器,也是个原生代码编译器。它可以在大多数平台运行,GHC在并发和并行上具有高性能的实现能力,也有丰富的类型系统,如广义代数数据类型和类型族(Type Families)。

单子是一个抽象类型,可以表达不同种类的计算,包括异常处理、非确定性、语法分析以及软件事务内存,其中一个应用是用于表达副作用的类型。单子定义为普通的数据类型,同时Haskell也为其提供了几种语法糖。

Haskell有一个活跃的社区,在线上包仓库Hackage上有丰富的第三方开源库或工具。

三、Haskell的函数结构

如下是Haskell语言的”Hello world”,注意其中除最后一行外皆可省略。

module Main where

main :: IO ()

main = putStrLn “Hello, World!”

如下是阶乘函数的Haskell实现:

fac :: Int -> Int

fac 0 = 1

fac n = n * fac (n – 1)

它将阶乘描述成有一个基本终止情形的递归函数。这跟数学定义中对阶乘的描述很相似。事实上,Haskell中很多的代码的语法与功能都和数学一致。

上面的递归函数的名列前茅行是可选的,它描述了这个函数的型态(types)。它可以读作函数fac的型态为整数至整数(function fac has a int-to-int type)。这就是说,它以一个整型为参数,并且返回另一个整型。

第二行依赖的模式匹配,是Haskell程序中一个重要的部分。注意函数的参数是用空格分隔而不是在括号中。当函数的参数是0时,它会返回整型1。对于其他的情况则尝试第三行。这是一个递归,它会一直执行只到满足基本的情形。负参数会导致无限递归,一个guard保证第三行不会执行负参数。

“Prelude”是一个类似C中标准库的小函数集合。使用Prelude,并用无指定参数的写法,它可以改成:

fac = product . enumFromTo 1

上面的定义接近于数学中的定义:f = g o h(参见复合函数),这并不是一个对变量赋值的语句。

四、Haskell的高阶函数

Haskell中可以定义高阶函数(Higher-order Function),既将函数作为一个参数来使用,也可以将函数作为结果输出,例如:

f :: (Int -> Int) ->(Int -> Int)

f g = \x -> g x + 5

这里f就是一个高阶函数,它取一个从Int到Int的函数g作为参数,输出一个从Int到Int的函数。高阶函数的使用在一些情况下将极大的简化代码。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平