我还在学习haskell并查看snap web框架.在他们的hello world例子中,有一个看起来很像的东西<|>
site :: Snap ()
site =
ifTop (writeBS "hello world") <|>
route [ ("foo", writeBS "bar")
, ("echo/:echoparam", echoHandler)
] <|>
dir "static" (serveDirectory ".")
Run Code Online (Sandbox Code Playgroud)
谷歌搜索这是惊人的挑战,快照文档只是<|>用作名词.它是什么,它做了什么?
我想了解简单的snaplet结构.另外,我什么时候需要制作一个snaplet和一个简单的侧库?如果我确实需要一个如何从库中取出它?
例如,我有一堆数据库函数,我在其中包装我的SQL代码,如下所示.
data Person = Person {personName :: ByteString, personAge :: Int}
connect :: IO Connection
connect = connectSqlite3 "/somepath/db.sqlite3"
savePerson :: Person -> IO ()
savePerson p = do
c <- connect
run c "INSERT INTO persons (name, age) \
\VALUES (?, ?)"
[toSql (personName p), toSql (personAge p)]
commit c
disconnect c
Run Code Online (Sandbox Code Playgroud)
每个函数都会启动一个新连接并在提交后关闭连接.我想制作一个snaplet是避免每个功能连接的方法吗?在我的处理程序中,我会像这样使用它:
insertPerson :: Handler App App ()
insertPerson = do
par <- getPostParams
let p = top par
liftIO $ savePerson p
where
top m = …Run Code Online (Sandbox Code Playgroud) 我想为POST数据生成解码结果.在转换'字符串'时,很多代码都被"浪费"了.这使代码变得丑陋.更好的解决方案?
import Codec.Binary.Url (decode')
import qualified Data.ByteString.Lazy.Char8 as L (unpack)
import qualified Data.ByteString.Char8 as S (unpack, pack)
import qualified Data.ByteString.Lazy as LBS (pack)
decodeUrlHandler :: Snap()
decodeUrlHandler = do
body <- readRequestBody (maxBound :: Int64)
writeLBS $ LBS.pack $ map (fromMaybe 0) $ decode' $ L.unpack body
Run Code Online (Sandbox Code Playgroud)
你的代码为此目的是什么?
我可以在Yesod或任何其他具有可比数据库功能的Haskell Web框架中进行长时间轮询吗?
确切地说,我想延迟HTTP响应,直到发生一些有趣的事情.还应该有一个超时,在此之后客户端将被提供响应,说"没有发生",然后客户端将发出相同的请求.
为了让生活更加复杂,我想到的应用程序是通过HTTP/HTML5和MIDP客户端的一个非常紧凑的UDP协议提供所有的东西.来自任一协议的事件都可以在任一协议中释放响应
TIA,阿德里安.
我正在为在线调查写一个网站.我有一个问题列表,所有问题都在一个html页面上进行,列表的长度未知.每个问题都有表格存储在模板中qu1.tpl,页面是qu.tpl.现在我想:
qu1.tpl为每个问题替换一些名称
qu.tpl一次性更换一些东西
并坚持的所有实例qu1.tpl进qu.tpl
用我在教程中了解到,我试图递归更换标签<qulist/>与<apply template="qu1.tpl"><qulist/>在qu.tpl使用localHeist和bindString但这不能工作,因为qu.tpl这样的新插入的应用标签不能解决已经呈现.
我该怎么做呢?
(我想这是一个更普遍的问题.如果您能想到答案适用的其他应用程序,请为搜索引擎添加文本和标签.)
是否可以将列表参数从浏览器传递到Snap中的处理函数?如何从列表构造多参数URL并将其发送到处理函数?
例如,我需要删除一些表行或任何其他对象.我不能用通常的REST路由做到这一点:
("/objects/:id", method DELETE deleteObject)
Run Code Online (Sandbox Code Playgroud)
仅仅因为可能会有太多并且逐个删除100行可能会有点单调乏味.
我通过复选框输入选择了注定的对象,比如需要删除[3,4,6,8]行.那么如何将该列表传递给URL中的处理程序以及该操作的路由是什么样的呢?
好吧,我终于用jquery和ajax调用了.Snap的"getParams"函数可以处理多个参数URL,但我仍然无法弄清楚如何在没有jquery和ajax的情况下实际构建URL.
我使用javascript来收集要删除的项目并构建项目数组.然后我使用ajax构造多个参数URL并将其发送给处理程序.使用此方法和Snap几乎没有注意事项:
- Snaps的"getParams"函数仅支持旧式多参数URL:
"a=1&a=2&a=3&a=4"
Run Code Online (Sandbox Code Playgroud)
而不是新的:
"a[]=1&a[]=2&a[]=3&a[]=4"
Run Code Online (Sandbox Code Playgroud)
这使得传递复杂参数变得不可能
- 路线应该是:
("/objects/", method DELETE deleteObject)
Run Code Online (Sandbox Code Playgroud)
而不是:
("/objects/:ids", method DELETE deleteObject)
Run Code Online (Sandbox Code Playgroud)
我没有回答我的问题,因为我不相信这是通过snap传递多个参数URL的唯一方法.
虽然"getParams"可以处理它,但我的问题仍然存在:我如何构建URL并将其发送给处理程序?
例如,Rails在视图逻辑中使用"link_to"函数来构造URL.Snap不使用模板内部的任何逻辑,那么它是如何工作的呢?它只是不能在snap中传递多个参数URL的唯一方法是借助javascript ...?
请有人为我确认一下吗?
我想知道以CRUD为中心的Web应用程序可以从Haskell的类型系统中获益多少,特别是当前端使用像AngularJS这样的Javascript MVC框架构建时,它会传递无类型数据对象.
在我看来,只要将Haskell数据类型转换为传递给繁重的JavaScript MVC框架层的JSON对象,将Haskell的类型系统作为Web堆栈的一部分的好处就会开始大幅减少,因为没有办法让类型检查器确保整个Web应用程序中数据流的类型完整性.
例如,您可以更改数据库模式和关联的Haskell类型,但类型检查器将无法告诉您JavaScript MVC前端的哪些部分也需要更新.我认为这是一个问题.
我是否正确地陈述了问题,如果是这样,Haskell Web应用程序开发人员在这一点上给出了什么建议?
我正在尝试理解编译的拼接以及如何将它们与消化函子形式一起使用.有人有任何代码示例吗?
我按照安装Haskell的snap框架的说明进行操作:
http://janrain.com/blog/tutorial-building-a-sample-application-with-haskell-snap-postgresql-and-the-postgresql-simple-snaplet/
Run Code Online (Sandbox Code Playgroud)
执行时
snap init
Run Code Online (Sandbox Code Playgroud)
我获得-bash: snap: command not found(在Mac OSX上),我在安装快照后打开了一个新的终端窗口.二进制文件安装在
/Users/<USER NAME>/Library/Haskell/ghc-7.6.3/lib/snap-0.12.1/bin
Run Code Online (Sandbox Code Playgroud)
当snap init以此路径开头时,snap也可正常工作.但是,此票证(用于Windows cabal安装程序)
http://trac.haskell.org/haskell-platform/ticket/175
Run Code Online (Sandbox Code Playgroud)
表明这不应该发生.当cabal安装新软件包时,它应该将正确的目录添加到路径环境中.运行set | grep "snap"或不set | grep "cabal"返回任何内容 有关如何(自动)将正确的目录添加到PATH环境以供将来安装的任何想法?
能够Network.WebSockets从 snaplet 内部使用该模块会很好,但我不知道如何实际操作。
使用它的runWebSocketsSnap :: MonadSnap m => ServerApp -> m ()函数Network.WebSockets.Snap很容易在我的应用程序中包含一个简单的无状态 websocket 服务器:
routes :: [(ByteString, Handler App App ())]
routes = [ ("/ws", runWebSocketsSnap wsApp) ]
wsApp :: PendingConnection -> IO () -- this is the ServerApp type
wsApp pending = do
conn <- acceptRequest pending
forever $ do
msg <- receiveData conn
sendTextData conn ("Echo " `mappend` msg :: Text)
Run Code Online (Sandbox Code Playgroud)
但我的目标是维护 webscket 服务器的状态(例如,已连接客户端的列表,如http://jaspervdj.be/websockets/example.html)。或者,进入 snaplet 的酸状态存储会很好。
我的第一个想法是liftIO将 websocket …
haskell ×10
yesod ×2
acid-state ×1
cabal ×1
happstack ×1
heist ×1
javascript ×1
long-polling ×1
path ×1
websocket ×1