happstack教程提供以下示例:
main :: IO ()
main = simpleHTTP nullConf $ msum
[ do methodM GET
ok $ "You did a GET request.\n"
, do methodM POST
ok $ "You did a POST request.\n"
, dir "foo" $ do methodM GET
ok $ "You did a GET request on /foo.\n"
]
Run Code Online (Sandbox Code Playgroud)
这似乎ok $是多余的 - 有没有办法把它拉出来,msum这样你就不必写ok $三次了?我尝试了以下,但它甚至没有编译:
main :: IO ()
main = simpleHTTP nullConf $ ok $ msum
[ do methodM GET
"You did a …Run Code Online (Sandbox Code Playgroud) 我需要一个使用Haskell开发的Web服务器来运行旧的Python CGI应用程序.
任何建议表示赞赏!
我正在使用blaze-html.我终于能够总结我的头脑如何使用它,但是一些monad和变换确实让我一直绊倒.但是这里有一个特殊的绊脚石(很多人都会这么做,但是我会离开这里再到Happstack的Response和ServerPart monad).
如果我想将字符串文本附加到段落,我必须使用此函数(来自Text.Blaze.Html5):
p . toHtml :: ToMessage a => a -> Html
Run Code Online (Sandbox Code Playgroud)
一切都很好,除了......
toHtml :: ToMarkup a => a -> Markup
p :: Html -> Html
Run Code Online (Sandbox Code Playgroud)
我尽我所能搜索文档,我看不出Markup monad和Html monad是如何相互关联的.我如何处理所有类型和类型类?
我开始开发一个应用程序(一些无聊的会计软件供内部使用),并决定将其设置为基于Web的,因为这可以一次性解决几个问题.
现在有几个用于Haskell的webframeworks可供选择(happstack,yesod和snap),我仍然开始感到痛苦,不得不处理HTML,CSS和非常聪明的有线JavaScript.
嗯.
那么我认为可能会尝试使用所有AJAX方式并在Cappuccino或SproutCore中执行UI .(SEO不是问题).
但是现在我真的不需要一个完整的Web框架,比如上面三个中的一个,一个可以提供JSON或XML包装的数据的HTTP服务器在理论上应该足够了.
现在还有一点可以使用这三者中的任何一个吗?
最重要的是这种方法的可行性如何?
半滑舌鳎
我目前正在关注他们网站上的Happstack lite教程.http://happstack.com/page/view-page-slug/9/happstack-lite-tutorial
现在,我正在实现该echo功能,编译器给我一个我不太懂的错误信息.这是我的代码:
echo :: ServerPart Response
echo =
path $ \(msg :: String) ->
ok $ template "echo" $ do
h1 "Echo service"
p "Giant, Haskell style Papagallo"
p msg
Run Code Online (Sandbox Code Playgroud)
这是错误信息:
src/motiondude.hs:35:15:
Couldn't match type `[Char]' with `Text.Blaze.Internal.MarkupM ()'
Expected type: Html
Actual type: String
In the first argument of `p', namely `msg'
In a stmt of a 'do' block: p msg
In the second argument of `($)', namely
`do { h1 "Echo service";
p "Giant, …Run Code Online (Sandbox Code Playgroud) 从
http://happstack.com/docs/crashcourse/HappstackState.html
当我运行服务器时,偷看计数器增加了
相关的相关代码是:
handlers :: ServerPart Response
handlers =
msum [ dir "peek" $ do c <- query PeekCounter
ok $ toResponse $ "peeked at the count and saw: " ++ show (unCounter c)
, do c <- update (AddCounter 1)
ok $ toResponse $ "New count is: " ++ show (unCounter c)
]
Run Code Online (Sandbox Code Playgroud)
但是,当我修改它时
handlers :: ServerPart Response
handlers =
msum [ dir "peek" $ do c <- query PeekCounter
ok $ toResponse $ "peeked at …Run Code Online (Sandbox Code Playgroud) 我不明白为什么我不能分解(让我们说IO)monad.喜欢IO a -> a?
我的问题使用happstack和想要得到的时候起源Text的出ServerPart (Maybe Text)这是由返回(optional $ lookText "domain").然后我记得读到IOmonad无法逃脱.
我已经读过unsafePerformIO它以及它为什么不好的原因,但这些原因似乎都没有回答我的问题.
我这里有一个元组列表,我想dir..在每个元组的第一个元素上应用函数。我怎样才能做到这一点?在此先多谢!
[ ("grid", gridResponse),
("graph", graphResponse),
("image", graphImageResponse),
("timetable-image", timetableImageResponse x),
("graph-fb",toResponse ""),
("post-fb",toResponse ""),
("test", getEmail),
("test-post", postToFacebook),
("post", postResponse),
("draw", drawResponse),
("about", aboutResponse),
("privacy" ,privacyResponse),
("static", serveDirectory),
("course", retrieveCourse),
("all-courses", allCourses),
("graphs", queryGraphs),
("course-info", courseInfo),
("depts", deptList),
("timesearch",searchResponse),
("calendar",calendarResponse),
("get-json-data",getGraphJSON),
("loading",loadingResponse),
("save-json", saveGraphJSON)?
Run Code Online (Sandbox Code Playgroud) 我正在使用HDBC从数据库中检索数据,然后尝试使用Happstack将此数据发送到Web客户端.
myFunc :: Integer -> IO String
myFunc = ... fetch from db here ...
handlers :: ServerPart Response
handlers =
do decodeBody (defaultBodyPolicy "/tmp/" 0 1000 1000)
msum [
dir "getData" $ ok $ toResponse $ myFunc $ toInteger 1
]
mainFunc = simpleHTTP nullConf handlers
Run Code Online (Sandbox Code Playgroud)
当我构建上面的代码时,我收到此错误:
使用"toResponse"时没有(ToMessage(IO String))的实例
我尝试了什么?
IO String为String(liftIO例如使用).提前致谢.
手动Web路由的目的是什么?为什么不是每个人都只是自动映射URL和模块/方法/函数名称?
我认为你可以从全自动映射开始,然后你就可以使用Apache mod_rewrite或mod_redirect,或者如果你想以一种改变URL的方式重构,而不破坏现有的URL.
我想在haskell中编写一个简单的web服务器,它提供当前时间.时间应以json格式返回.
这是我到目前为止:
{-# LANGUAGE DeriveDataTypeable #-}
import Happstack.Server
import Text.JSON.Generic
import Data.Time
import System.IO.Unsafe
data TimeStr = TimeStr {time :: String} deriving (Data, Typeable)
main = simpleHTTP nullConf $ ok $ toResponse $ encodeJSON (TimeStr $ show (unsafePerformIO getCurrentTime))
Run Code Online (Sandbox Code Playgroud)
我知道unsafePerformIO应该避免,但我还没有找到更好的解决方案.也许这就是问题所在?我对monad有一个非常基本的了解.
结果如下:
{"time":"2014-10-16 16:11:38.834251 UTC"}
Run Code Online (Sandbox Code Playgroud)
问题是,当我刷新localhost:8000时间不会改变.是否有某种记忆正在进行?