Contenu connexe Similaire à 走马观花— Haskell Web 开发 (20) 走马观花— Haskell Web 开发2. About me
● CPP( 静 ) → Python( 动 ) → Haskell( 静 )
● 专业 Python
● 业余 Haskell
3. 前情提要 你将会了解到:
● 一门 20 多年依然冷门的语言的简单介绍
● 微线程模型并发处理的示例程序
● 一种对“流式处理”的强大抽象
● 一个常数内存占用的 HTTP 代理服务器的实现
● 一种类型安全的“宏”,并用它创建 DSL 的例子
6. 虚的部分
• 纯,函数式(抽象!抽象!抽象!)
• 命令式(显式的副作用管理)
• 强大的静态类型系统(避免逻辑矛盾!)
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
21. URL Route
mkYesod "Simple" [parseRoutes|
/ HomeR GET
/static StaticR GET
/article ArticleR GET POST
/article/#Int ArticleDetailR GET
|]
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”