Haskell:修订间差异
Luckas-bot(留言 | 贡献) 小 r2.7.1) (機器人 新增: simple:Haskell (programming language) |
|||
第35行: | 第35行: | ||
它将阶乘描述成有一个基本终止情形的递归函数。这跟数学定义中对阶乘的描述很相似。事实上,Haskell中很多的代码的语法与功能都和数学一致。 |
它将阶乘描述成有一个基本终止情形的递归函数。这跟数学定义中对阶乘的描述很相似。事实上,Haskell中很多的代码的语法与功能都和数学一致。 |
||
上面的递归函数的第一行是可选的,它描述了这个函数的'''型態'''('''types''')。它可以读作'''函 |
上面的递归函数的第一行是可选的,它描述了这个函数的'''型態'''('''types''')。它可以读作'''函数fac的型態為整數至整數(function fac has a int-to-int type)'''。这就是说,它以一个整型为参数,并且返回另一个整型。 |
||
第二行依赖的[[模式匹配]],是Haskell程序中一个重要的部分。注意函数的参数是用空格分隔而不是在括号中。当函数的参数是 0 时,它会返回整型 1。对于其他的情况则尝试第三行。这是一个[[递归]],它会一直执行只到满足基本的情形。负参数会导致无限递归,一个[[guard(computing)|guard]]保证第三行不会执行负参数。 |
第二行依赖的[[模式匹配]],是Haskell程序中一个重要的部分。注意函数的参数是用空格分隔而不是在括号中。当函数的参数是 0 时,它会返回整型 1。对于其他的情况则尝试第三行。这是一个[[递归]],它会一直执行只到满足基本的情形。负参数会导致无限递归,一个[[guard(computing)|guard]]保证第三行不会执行负参数。 |
2012年3月18日 (日) 13:42的版本
编程范型 | 函数式编程, 非即刻運算,模組化 |
---|---|
发行时间 | 1990年 |
当前版本 |
|
型態系統 | 強型態,靜態 |
網站 | www.Haskell.org |
主要實作產品 | |
GHC, Hugs, NHC, JHC, Yhc | |
啟發語言 | |
Miranda, ML, Gofer | |
影響語言 | |
Python |
Haskell(发音为/ˈhæskəl/)是一种纯函数式编程语言,它的命名源自美国数学家哈斯凱爾·加里,他在数学逻辑方面上的工作使得函数式编程语言有了广泛的基础。Haskell语言是1990年在编程语言Miranda的基础上标准化的,并且以λ演算为基础发展而来。这也是为什么Haskell语言以希腊字母「λ」(Lambda)作为自己的标志。Haskell语言的最重要的两个应用是Glasgow Haskell Compiler (GHC)和Hugs(一个Haskell语言的编译器)。本語言的特式是利用很簡單的敘述就可以完成链表、矩陣等數據結構。
发展
在1980年代末已经出现了一些函数式编程语言,它们各有优缺点。为了使它们在科研上有一种统一的研究和发展的基础,应该有一种标准化的全新的语言使函数式编程语言在此基础上实现统一。接下来有人想以Miranda作为此项工作的出发点,但Miranda的开发者却对此项工作并不感兴趣。就在这种背景下Haskell 1.0于1990年發佈。
这种语言的最新版本是在原来版本的基础上经过修改的变体(Haskell-98-Standard于1999年)。Haskell是现如今广泛被用于研究的一种函数语言。现在以Haskell为基础的语言衍生物有很多,它们是:并行Haskell、扩充Haskell(旧名Goffin)、Eager Haskell、Eden、DNA-Hakell 和面向对象的变体(Haskell++, O'Haskell,Mondrian)。另外Haskell还被作为在新语言设计时的样板。
示例
Haskell的函数结构
函数语言中的"Hello world"是阶乘函数。用 Haskell 如下表达:
fac :: Integer -> Integer
fac 0 = 1
fac n | n > 0 = 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的函数。高阶函数的使用在一些情况下将极大的简化代码。
Haskell的编译器
外部連結
- (英文) Haskell 的官方主页
- (英文) HaskellWiki:Haskell 社群主網站
- (英文) UNSW 的 Haskell 教程
- (英文) Haskell 笑話
- (英文) Haskell 舊的討論主題
- (英文) Haskell vs. Ada vs. C++ vs. Awk vs. ...... 一個實驗性的前衛語言(PostScript檔案)
- (英文) Haskell 編程的變革 -- 一個輕快的 Haskell 編程風格總纜
- (英文) 一個Haskell研究者的線上介紹
- (英文) ePolyglot -- 將 Haskell、Python與Eiffel 結合的語言
- (英文) Haskell 函式庫
教學手冊
- (英文)用 Haskell 寫程式,Graham Hutton 撰寫
- (英文)另一個 Haskell 教學手冊 -- 由 Hal Daume III 所寫的好手冊,需要比官方教學手冊少的先備知識
- (英文)A Gentle Introduction to Haskell 98(較高階的教學手冊,有PDF檔案)
- (英文)Haskell Tutorial for C Programmers,Eric Etheridge 撰寫
- (英文)在 Haskell.org 的教學手冊列表
- (英文)Haskell 編程典範
- ^ [Haskell] Announcing Haskell 2010. 2009年11月24日 [2023年1月11日].