SlideShare uma empresa Scribd logo
1 de 25
Baixar para ler offline
走马观花—— Haskell Web 开发




   黄毅 http://www.yi-programmer.com/
      yi.codeplayer@gmail.com
About me
●   CPP( 静 ) → Python( 动 ) → Haskell( 静 )
●   专业 Python
●   业余 Haskell
前情提要      你将会了解到:



●   一门 20 多年依然冷门的语言的简单介绍
●   微线程模型并发处理的示例程序
●   一种对“流式处理”的强大抽象
●   一个常数内存占用的 HTTP 代理服务器的实现
●   一种类型安全的“宏”,并用它创建 DSL 的例子
So ,
Why Haskell ?
Quest
for Certain Knowledge
    of Programming
虚的部分


•   纯,函数式(抽象!抽象!抽象!)

•   命令式(显式的副作用管理)

•   强大的静态类型系统(避免逻辑矛盾!)
实在一点,
 针对 Web 开发,
Haskell 能提供什么?
一、微线程和高并发
server <- listenOn (PortNumber 3000)
forever $ do
   (client, h, p) <- accept server
   hSetBuffering client NoBuffering
   forkIO $ forever $ do
       request <- hGetLine client
       hPrintf client "%s from %s:
%dn" request h (toInteger p)
二、 Iteratee
  针对流式数据处理的抽象



http://www.haskell.org/haskellwiki/Enumerator_and_iteratee
示例: A http proxy server
 runs in constant memory




http://github.com/yihuang/webproxy-yesod
状态机
状态机组合!



requestLine :: Parser Request

requestLine = do

    method <- P.takeWhile1 isToken <* char8 ' '

    uri <- P.takeWhile1 (/=32) <* char8 ' '

    version <- httpVersion <* endOfLine

    ...
祭代码 状态机抽象

data Stream a = EOF
              | Chunks [a]

data Iteratee a b =
        Continue (Stream a → Step a b)
      | Yield b (Stream a)
      | Error String

data Enumerator a b =
         Iteratee a b → Iteratee a b
祭代码 Proxy Application

fetch :: Request IO
      -> (Status -> Headers -> Iteratee..)
      -> IO a
fetch req f = withManager $ m ->
               run_ $ http req f m

getIndexR = do
    req <- liftIO $ parseUrl url
    sendWaiResponse $ ResponseEnumerator
                             $ fetch req
简单 benchmark



●   300M 数据文件, 100 并发,恒定 25M RES
DSL
for web framework
Template Haskell


●   Run haskell at compile time

●   Imagine type safe lisp macro
URL Route
mkYesod "Simple" [parseRoutes|
/ HomeR GET
/static StaticR GET
/article ArticleR GET POST
/article/#Int ArticleDetailR GET
|]
Templating
[|hamlet|
<div .section >
     <h3>#{title}
     <p>#{content}
|]
Widgets ( EDSL )
dateTimeField name = do
   addScriptRemote “...”
   addDateTimeCss “...”
   toWidget [hamlet|<input ... |]


autoCompleteField name = do
   addScriptRemote “...”
   addDateTimeCss “...”
   toWidget [hamlet|<input ... |]


myForm = do
   [hamlet|<form ...|]
   DateTimeField “date”
   autoCompleteField “tag”
Widgets result
<script datetime.js
<script autocomplete.js
…
<link datetime.css
<link autocomplete.css
…
<input ...
Thanks !

Mais conteúdo relacionado

Mais procurados

Class 20170126
Class 20170126Class 20170126
Class 20170126Ivan Wei
 
编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editortaobao.com
 
Python xmlrpc-odoo
Python xmlrpc-odooPython xmlrpc-odoo
Python xmlrpc-odoorobin yang
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoloadjay li
 
不一樣的Web server... coServ
不一樣的Web server... coServ不一樣的Web server... coServ
不一樣的Web server... coServBen Lue
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
Mac os Terminal 常用指令與小技巧
Mac os Terminal 常用指令與小技巧Mac os Terminal 常用指令與小技巧
Mac os Terminal 常用指令與小技巧Chen Liwei
 
JCConf2015: groovy to gradle
 JCConf2015: groovy to gradle JCConf2015: groovy to gradle
JCConf2015: groovy to gradleChing Yi Chan
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops琛琳 饶
 

Mais procurados (12)

Execution
ExecutionExecution
Execution
 
Class 20170126
Class 20170126Class 20170126
Class 20170126
 
编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editor
 
Python xmlrpc-odoo
Python xmlrpc-odooPython xmlrpc-odoo
Python xmlrpc-odoo
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoload
 
不一樣的Web server... coServ
不一樣的Web server... coServ不一樣的Web server... coServ
不一樣的Web server... coServ
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
Mac os Terminal 常用指令與小技巧
Mac os Terminal 常用指令與小技巧Mac os Terminal 常用指令與小技巧
Mac os Terminal 常用指令與小技巧
 
JCConf2015: groovy to gradle
 JCConf2015: groovy to gradle JCConf2015: groovy to gradle
JCConf2015: groovy to gradle
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops
 
fis
fisfis
fis
 

Semelhante a 走马观花— Haskell Web 开发

运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践Li JianYe
 
The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)jeffz
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战fengmk2
 
高性能远程调用解决方案
高性能远程调用解决方案高性能远程调用解决方案
高性能远程调用解决方案Ady Liu
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學Bo-Yi Wu
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战fengmk2
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发litaocheng
 
深入浅出Netty l.t
深入浅出Netty   l.t深入浅出Netty   l.t
深入浅出Netty l.toleone
 
Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisXiaoming Chen
 
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5 Tony Deng
 
廖雪峰 Saa s ovp
廖雪峰 Saa s ovp廖雪峰 Saa s ovp
廖雪峰 Saa s ovpdrewz lin
 
Inside the browser
Inside the browserInside the browser
Inside the browserotakustay
 
利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geekJohnson Gau
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Servicesjavatwo2011
 
Java8 lambda
Java8 lambdaJava8 lambda
Java8 lambdakoji lin
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计锐 张
 

Semelhante a 走马观花— Haskell Web 开发 (20)

运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践
 
Berserk js
Berserk jsBerserk js
Berserk js
 
The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战
 
高性能远程调用解决方案
高性能远程调用解决方案高性能远程调用解决方案
高性能远程调用解决方案
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
 
Node Web开发实战
Node Web开发实战Node Web开发实战
Node Web开发实战
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发
 
深入浅出Netty l.t
深入浅出Netty   l.t深入浅出Netty   l.t
深入浅出Netty l.t
 
Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log Analysis
 
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5
 
廖雪峰 Saa s ovp
廖雪峰 Saa s ovp廖雪峰 Saa s ovp
廖雪峰 Saa s ovp
 
Inside the browser
Inside the browserInside the browser
Inside the browser
 
利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services
 
Java8 lambda
Java8 lambdaJava8 lambda
Java8 lambda
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计
 
Hi Haskell
Hi HaskellHi Haskell
Hi Haskell
 

Mais de Gump Law

Rails hello
Rails helloRails hello
Rails helloGump Law
 
Location baseda rengine
Location baseda rengineLocation baseda rengine
Location baseda rengineGump Law
 
Android hw accelerated_2d_rendering
Android hw accelerated_2d_renderingAndroid hw accelerated_2d_rendering
Android hw accelerated_2d_renderingGump Law
 
iOS开发常用库推荐之一@techparty
iOS开发常用库推荐之一@techpartyiOS开发常用库推荐之一@techparty
iOS开发常用库推荐之一@techpartyGump Law
 
翻译与写作技术图书那点事
翻译与写作技术图书那点事翻译与写作技术图书那点事
翻译与写作技术图书那点事Gump Law
 
我为何使用
我为何使用我为何使用
我为何使用Gump Law
 
深入PHP内核之路
深入PHP内核之路深入PHP内核之路
深入PHP内核之路Gump Law
 
Guangzhou Techparty Pre show 20110917
Guangzhou Techparty Pre show 20110917Guangzhou Techparty Pre show 20110917
Guangzhou Techparty Pre show 20110917Gump Law
 
Java桌面应用开发
Java桌面应用开发Java桌面应用开发
Java桌面应用开发Gump Law
 
BI 商业智能简述
BI 商业智能简述BI 商业智能简述
BI 商业智能简述Gump Law
 
R语言简介
R语言简介R语言简介
R语言简介Gump Law
 

Mais de Gump Law (12)

Rails hello
Rails helloRails hello
Rails hello
 
Location baseda rengine
Location baseda rengineLocation baseda rengine
Location baseda rengine
 
Android hw accelerated_2d_rendering
Android hw accelerated_2d_renderingAndroid hw accelerated_2d_rendering
Android hw accelerated_2d_rendering
 
iOS开发常用库推荐之一@techparty
iOS开发常用库推荐之一@techpartyiOS开发常用库推荐之一@techparty
iOS开发常用库推荐之一@techparty
 
翻译与写作技术图书那点事
翻译与写作技术图书那点事翻译与写作技术图书那点事
翻译与写作技术图书那点事
 
我为何使用
我为何使用我为何使用
我为何使用
 
深入PHP内核之路
深入PHP内核之路深入PHP内核之路
深入PHP内核之路
 
Guangzhou Techparty Pre show 20110917
Guangzhou Techparty Pre show 20110917Guangzhou Techparty Pre show 20110917
Guangzhou Techparty Pre show 20110917
 
Three20
Three20Three20
Three20
 
Java桌面应用开发
Java桌面应用开发Java桌面应用开发
Java桌面应用开发
 
BI 商业智能简述
BI 商业智能简述BI 商业智能简述
BI 商业智能简述
 
R语言简介
R语言简介R语言简介
R语言简介
 

走马观花— Haskell Web 开发

  • 1. 走马观花—— Haskell Web 开发 黄毅 http://www.yi-programmer.com/ yi.codeplayer@gmail.com
  • 2. About me ● CPP( 静 ) → Python( 动 ) → Haskell( 静 ) ● 专业 Python ● 业余 Haskell
  • 3. 前情提要 你将会了解到: ● 一门 20 多年依然冷门的语言的简单介绍 ● 微线程模型并发处理的示例程序 ● 一种对“流式处理”的强大抽象 ● 一个常数内存占用的 HTTP 代理服务器的实现 ● 一种类型安全的“宏”,并用它创建 DSL 的例子
  • 6. 虚的部分 • 纯,函数式(抽象!抽象!抽象!) • 命令式(显式的副作用管理) • 强大的静态类型系统(避免逻辑矛盾!)
  • 7. 实在一点, 针对 Web 开发, Haskell 能提供什么?
  • 9. server <- listenOn (PortNumber 3000) forever $ do (client, h, p) <- accept server hSetBuffering client NoBuffering forkIO $ forever $ do request <- hGetLine client hPrintf client "%s from %s: %dn" request h (toInteger p)
  • 10.
  • 11. 二、 Iteratee 针对流式数据处理的抽象 http://www.haskell.org/haskellwiki/Enumerator_and_iteratee
  • 12. 示例: A http proxy server runs in constant memory http://github.com/yihuang/webproxy-yesod
  • 13.
  • 15. 状态机组合! requestLine :: Parser Request requestLine = do method <- P.takeWhile1 isToken <* char8 ' ' uri <- P.takeWhile1 (/=32) <* char8 ' ' version <- httpVersion <* endOfLine ...
  • 16. 祭代码 状态机抽象 data Stream a = EOF | Chunks [a] data Iteratee a b = Continue (Stream a → Step a b) | Yield b (Stream a) | Error String data Enumerator a b = Iteratee a b → Iteratee a b
  • 17. 祭代码 Proxy Application fetch :: Request IO -> (Status -> Headers -> Iteratee..) -> IO a fetch req f = withManager $ m -> run_ $ http req f m getIndexR = do req <- liftIO $ parseUrl url sendWaiResponse $ ResponseEnumerator $ fetch req
  • 18. 简单 benchmark ● 300M 数据文件, 100 并发,恒定 25M RES
  • 20. Template Haskell ● Run haskell at compile time ● Imagine type safe lisp macro
  • 21. URL Route mkYesod "Simple" [parseRoutes| / HomeR GET /static StaticR GET /article ArticleR GET POST /article/#Int ArticleDetailR GET |]
  • 22. Templating [|hamlet| <div .section > <h3>#{title} <p>#{content} |]
  • 23. Widgets ( EDSL ) dateTimeField name = do addScriptRemote “...” addDateTimeCss “...” toWidget [hamlet|<input ... |] autoCompleteField name = do addScriptRemote “...” addDateTimeCss “...” toWidget [hamlet|<input ... |] myForm = do [hamlet|<form ...|] DateTimeField “date” autoCompleteField “tag”
  • 24. Widgets result <script datetime.js <script autocomplete.js … <link datetime.css <link autocomplete.css … <input ...