An advanced, purely functional programming language


Declarative, statically typed code.

primes = filterPrime [2..]
  where filterPrime (p:xs) =
          p : filterPrime [x | x <- xs, x `mod` p /= 0]

Try it!


Features

Statically typed

Haskell中的每个表达式都有一个在编译时确定的类型. 由功能应用程序组合在一起的所有类型都必须匹配. 如果没有,程序将被编译器拒绝. 类型不仅成为一种保证形式,而且成为表达程序构造的语言.

Click to expand

所有Haskell值都有一个类型:

char = 'a'    :: Char
int = 123     :: Int
fun = isDigit :: Char -> Bool

您必须将正确的值类型传递给函数,否则编译器将拒绝该程序:

类型错误
isDigit 1

您可以将字节解码为文本:

bytes = Crypto.Hash.SHA1.hash "hello" :: ByteString
text = decodeUtf8 bytes               :: Text

但是您无法解码Text,Text已经是Unicode点的向量:

类型错误
doubleDecode = decodeUtf8 (decodeUtf8 bytes)

Purely functional

Haskell中的每个函数都是数学意义上的函数(即"纯"). 甚至有副作用的IO操作也只是由纯代码产生的对操作的描述. 没有语句或指令,只有不能突变变量(局部或全局)或访问状态(如时间或随机数)的表达式.

Click to expand

以下函数接受一个整数并返回一个整数. 按类型,它不能产生任何副作用,也不能使任何参数突变.

square :: Int -> Int
square x = x * x

以下字符串串联是可以的:

"Hello: " ++ "World!" 

以下字符串连接是类型错误:

类型错误
"Name: " ++ getLine

因为getLine类型是IO String而不是String ,所以像"Name: " . 因此,通过类型系统,您无法将纯度与杂质混合和匹配.

Type inference

您不必显式写出Haskell程序中的每种类型. 通过双向统一每种类型来推断类型. 但是,可以根据需要写出类型,也可以要求编译器为您编写类型以方便使用.

Click to expand

此示例为每个绑定具有类型签名:

main :: IO ()
main = do line :: String <- getLine
          print (parseDigit line)
  where parseDigit :: String -> Maybe Int
        parseDigit ((c :: Char) : _) =
          if isDigit c
             then Just (ord c - ord '0')
             else Nothing

但是你可以这样写:

main = do line <- getLine
          print (parseDigit line)
  where parseDigit (c : _) =
          if isDigit c
             then Just (ord c - ord '0')
             else Nothing

您还可以使用推论来避免浪费时间解释您想要的内容:

do ss <- decode "[\"Hello!\",\"World!\"]"
   is <- decode "[1,2,3]"
   return (zipWith (\s i -> s ++ " " ++ show (i + 5)) ss is)
 => Just ["Hello! 6","World! 7"]

Types give a parser specification for free, the following input is not accepted:

do ss <- decode "[1,2,3]"
   is <- decode "[null,null,null]"
   return (zipWith (\s i -> s ++ " " ++ show (i + 5)) ss is)
 => Nothing

Concurrent

Haskell由于对效果进行了明确的处理,因此非常适合于并发编程. 它的旗舰编译器GHC带有高性能并行垃圾收集器和轻量级并发库,其中包含许多有用的并发原语和抽象.

Click to expand

轻松启动线程并与标准库通信:

main = do
  done <- newEmptyMVar
  forkIO (do putStrLn "I'm one thread!"
             putMVar done "Done!")
  second <- forkIO (do threadDelay 100000
                       putStrLn "I'm another thread!")
  killThread second
  msg <- takeMVar done
  putStrLn msg

对线程使用异步API:

do a1 <- async (getURL url1)
  a2 <- async (getURL url2)
  page1 <- wait a1
  page2 <- wait a2
  ...

带有软件事务存储器的原子线程:

transfer :: Account -> Account -> Int -> IO ()
transfer from to amount =
  atomically (do deposit to amount
                 withdraw from amount)

原子事务必须是可重复的,因此在类型系统中禁用了任意IO:

类型错误
main = atomically (putStrLn "Hello!")

Lazy

函数不评估其参数. 这意味着程序可以很好地组合在一起,并且仅通过编写常规函数就可以编写控制结构(例如if / else). Haskell代码的纯净性使将功能链融合在一起变得容易,从而带来性能优势.

Click to expand

轻松定义控制结构:

when p m = if p then m else return ()
main = do args <- getArgs
          when (null args)
               (putStrLn "No args specified!") 

如果您发现重复的表达方式,例如

if c then t else False

你可以给它起个名字

and c t = if c then t else False

然后以与原始表达相同的效果使用它.

通过编写惰性函数来获得代码重用. 通过重用mapor函数来表达any函数是很自然的:

any :: (a -> Bool) -> [a] -> Bool
any p = or . map p

重用mapfilterfoldr等中的递归模式.

Packages

对Haskell的开源贡献非常活跃,公共软件包服务器上提供了广泛的软件包.

Click to expand

有6,954个免费提供的软件包. 以下是最常见的示例:

bytestring 二进制数据 base 前奏,IO,线程
network Networking text Unicode文字
parsec 解析器库 directory File/directory
hspec 类似于RSpec的测试 attoparsec 快速解析器
monad-logger Logging persistent 数据库ORM
template-haskell Meta-programming tar 焦油档案
snap 网络框架 time 日期,时间等
happstack 网络框架 yesod 网络框架
containers 地图,图表,集合 fsnotify 观看文件系统
hint 解读Haskell unix UNIX绑定
SDL SDL绑定 OpenGL OpenGL图形系统
criterion Benchmarking pango 文字渲染
cairo 开罗图形 statistics 统计分析
gtk GTK +库 glib GLib库
test-framework 测试框架 resource-pool 资源池
conduit 流I / O mwc-random 高品质随机
QuickCheck 性能测试 stm 原子线程
blaze-html 标记生成 cereal 二进制解析/打印
xml XML解析器/打印机 http-client HTTP客户端引擎
zlib zlib/gzip/raw yaml YAML解析器/打印机
pandoc 标记转换 binary Serialization
tls TLS/SSL zip-archive 压缩压缩
warp 网络服务器 text-icu 文字编码
vector Vectors async 异步并发
pipes IO流 scientific 任意精度. nums
process 启动过程 aeson JSON解析器/打印机
dlist Difflists syb 通用编

Sponsors

DataDog为所有Haskell.org提供强大的,可自定义的24/7指标和监视集成,并在出现问题时向我们大声抱怨.

Fastly的下一代CDN为Haskell.org的所有下载和最高流量的服务(包括主要的Hackage服务器,Haskell Platform下载等)提供低延迟访问.

Packet提供计算,存储和网络资源,为全球多个地区的几乎所有Haskell.org提供动力.

Status.iohttps://status.haskell.org提供支持 ,并让我们轻松告诉您何时我们破坏了某些内容.

Galois提供基础设施,资金,行政资源,并在历史上托管过重要的Haskell.org基础设施,并帮助整个Haskell社区开展工作.

DreamHost已联手通过其Dream Objects服务为Haskell.org提供冗余的,可扩展的对象存储.

Webmon为核心haskell.org基础架构提供监视和升级.


Psst! Looking for the wiki?

这是新的Haskell主页! Wiki已移至wiki.haskell.org.


by  ICOPY.SITE