技术分享 | Haskell 工程化的挑战和收获
Posted 编程语言Lab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术分享 | Haskell 工程化的挑战和收获相关的知识,希望对你有一定的参考价值。
5 月 29 日,由极客邦旗下 InfoQ 中国主办的全球软件开发大会 QCon 2021 北京站正式拉开帷幕。大会为期三天,来自 EMQ 的 CTO、首席开源官韩冬作为其中“软件研发方法”专题的出品人,于 30 日上午分享了“Haskell 工程化的挑战和收获”。
• 1958 年 JohnMcCarthy 发表了 LISP(List Processor),之后 LISP 家族⽣生不息,现存的实现包括 SBCL(Common Lisp), Racket(Scheme), Clojure…
• 1970s 函数式编程语言 ML (MetaLanguage) 诞生,在接下来的几十年衍⽣出Standard ML,Caml,OCaml... 1969 ~ 1973@⻉尔实验室:C语⾔诞生
• 1978 年 BrianKernighan 和 Dennis Ritchie 出版巨著《The C Programming Language》,史称 K&RC,⾄今 C 系编程语言已成主流。
• 但是,⽜逼的计院教授们觉得这些语言还是弱爆了,于是在 1987 年聚在⼀起,要设计⼀个吊到爆的编程语言,这就是 Haskell。
> 2020 最受程序员喜爱的编程语言
data JValue
= JNUll
| JBool Bool
| JArray [JValue]
| JString Text
| JObject (Map Text JValue)
| JNumber Scientific
jvalue :: Parser JValue
jvalue = jnull
<|> (JBool <$> jboolean)
<|> (JArray <$> jarray)
<|> (JString <$> jstring)
<|> (JObject <$> jobject)
<|> (JNumber <$> jnumber)
jarray :: Parser [JValue]
jarray = between (char '[') (char ‘]')
(jvalue `sepBy` (char ‘,'))
Haskell 的代码强调纯函数和 IO 分离,所以对 Haskell 代码进行属性测试是一件司空见惯的事情,例如我们可以很容易的描述 base64 编解码器的 roundtrip 属性:
describe “base64 roundtrip props " $ do prop "base64Decode . base64Encode === id" $ \ xs -> (B.base64Decode (B.base64Encode xs) === xs)
transfer :: Gold -> Balance -> Balance -> STM ()
transfer qty fromBal toBal = do
fromQty <- readTVar fromBal
when (qty > fromQty) $
retry
writeTVar fromBal (fromQty - qty)
readTVar toBal >>= writeTVar toBal . (qty +)
select $
from $ \(b, p) -> do
where_ (b ^. BlogPostAuthorId ==. p ^. PersonId)
orderBy [asc (b ^. BlogPostTitle)]
return (b, p)
==================>
SELECT BlogPost.*, Person.*
FROM BlogPost, Person
WHERE BlogPost.authorId = Person.id
ORDER BY BlogPost.title ASC
这里简单地列举了一些互联网巨头使用 Haskell 编写的知名项目:
Facebook - sigma
Standard chart - Mu
Microsoft - bond
GitHub - semantic
-
好的地方
-
不好的地方
-
富有争议的地方
鉴于 Haskell 社区薄弱的工程生态,我们发起了 Haskell 工程生态项目 Z.Haskell(http://z.haskell.world/),该项目旨在解决常见的工程需求,例如 UTF-8 文本处理,二进制、文本序列化、反序列化框架,常见的文本、二进制格式支持:JSON,MessagePack等等。其中值得一提的是目前 Z.Haskell 提供了基于 libuv 的高效 IO 方案:
以上是关于技术分享 | Haskell 工程化的挑战和收获的主要内容,如果未能解决你的问题,请参考以下文章