SlideShare a Scribd company logo
走马观花—— 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)
走马观花— Haskell Web 开发
二、 Iteratee
  针对流式数据处理的抽象



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




http://github.com/yihuang/webproxy-yesod
走马观花— Haskell Web 开发
状态机
状态机组合!



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 !

More Related Content

PPT
PDF
Golang server design pattern
PPTX
Glider
PPTX
OpenResty/Lua Practical Experience
PDF
Go语言web开发
PPT
Nginx使用和模块开发
PPT
钟志 第八期Web标准化交流会
PDF
Jdbc中操作Blob、Clob等对象
Golang server design pattern
Glider
OpenResty/Lua Practical Experience
Go语言web开发
Nginx使用和模块开发
钟志 第八期Web标准化交流会
Jdbc中操作Blob、Clob等对象

What's hot (12)

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

Similar to 走马观花— Haskell Web 开发 (20)

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

More from Gump Law (12)

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

走马观花— Haskell Web 开发

  • 1. 走马观花—— Haskell Web 开发 黄毅 http://www.yi-programmer.com/ [email protected]
  • 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)
  • 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
  • 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 ...