有数以万亿计的monad教程,包括读者,当你阅读它时似乎都很清楚.但是当你真正需要写作时,它就变成了另一回事.
我从未使用过读者,只是在实践中从未使用过.所以尽管我读到了它,但我不知道如何去做.
我需要在Scotty中实现一个简单的数据库连接池,以便每个操作都可以使用该池.该池必须是"全局的",并且可由所有操作功能访问.我读到了这样做的方法是Reader monad.如果还有其他方式,请告诉我.
你能帮我一下,并正确地说明如何用Reader做这个吗?如果我看到自己的例子如何完成,我可能会学得更快.
{-# LANGUAGE OverloadedStrings #-}
module DB where
import Data.Pool
import Database.MongoDB
-- Get data from config
ip = "127.0.0.1"
db = "index"
--Create the connection pool
pool :: IO (Pool Pipe)
pool = createPool (runIOE $ connect $ host ip) close 1 300 5
-- Run a database action with connection pool
run :: Action IO a -> IO (Either Failure a)
run act = flip withResource (\x -> access x master db act) =<< …
Run Code Online (Sandbox Code Playgroud) 考虑最简单的scotty应用程序:
{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Data.Monoid (mconcat)
main = scotty 3000 $ do
get "/:word" $ do
beam <- param "word"
html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]
Run Code Online (Sandbox Code Playgroud)
我将此代码放入app.hs
并使用GHC进行编译.我用它来运行它./app
.简单.
当人们访问该网站时会发生什么?它只是一个./app
正在运行的.每当每个用户触发get "/:word" $ do
一行时,是否在同一个应用程序中创建了新的线程?有多少这样的线程可以存在?千?万?
运行./app
后显示消息Setting phasers to stun... (port 3000) (ctrl-c to quit)
.但它没有显示更多.它不会输出传入的Web请求.我该怎么做呢?这对于记录目的很有用.
我对WAI
界面进行了好奇的观察,虽然看起来很简单,但我惊讶地看到它在当前表格中需要多少次迭代才能稳定下来!
我曾认为CPS风格对于资源安全来说是最有趣的事情,但看起来还有很多值得学习的东西!
$ git log -p --reverse -- wai/Network/Wai.hs | grep '\+type Application'
+type Application = Request -> Iteratee B.ByteString IO Response
+type Application = Request -> ResourceT IO Response
+type Application = Request -> C.ResourceT IO Response
+type Application = Request -> IO Response
+type Application = Request -> (forall b. (Response -> IO b) -> IO b)
+type Application = Request -> (Response -> IO ResponseReceived)
-> IO ResponseReceived
Run Code Online (Sandbox Code Playgroud)
一些考古学产生了一些令人不满意的结果:
$ git log --reverse -G 'type …
Run Code Online (Sandbox Code Playgroud) 我想知道是否有人可以解释Haskell websocket库之间的差异以及它们如何与Yesod一起工作.
我要介绍的两个主要示例是Network.Websockets和wai websockets包的教程.
我无法为wai包找到一个好的例子或教程.既然yesod使用wai,它对简单的网络有什么优势呢?它是否意味着用于代替Network.Websockets或与Network.Websockets结合使用?
我见过一些例子,但我无法理解他们如何真正融入yesod环境.如果有人可以解释websockets如何与处理程序和IO相关联,那么在Yesod中,这将是很好的.
注意:我已经看到了这个问题和这个问题,但我无法理解如何应用它们,因为它们实际上没有解释websockets适合Yesod的位置.
这一定是非常愚蠢的事情.我刚刚开始玩scotty,无法正确提供静态内容.
import Network.HTTP.Types
import Web.Scotty
import qualified Data.Text as T
import Data.Monoid (mconcat)
import Data.Aeson (object, (.=))
import Network.Wai.Middleware.Static
main = scotty 3000 $ do
middleware $ staticPolicy (noDots >-> addBase "static")
get "/" $ file "index.html"
Run Code Online (Sandbox Code Playgroud)
很简单.这就是你在几本scotty教程中找到的内容.但由于某种原因它不起作用.在浏览器中通过'/'访问会给我'找不到文件'的东西.如果我在浏览器中键入"/index.html" - 它可以正常工作.但这是错的!我希望它可以通过'/'而不是'/index.html'访问.它忽略了root并直接获取html文件.如何通过'/'root提供index.html?没有太多的信息和我发现的几个教程指向上面的例子或类似的不能按预期工作.
我尝试将标题设置为'text/html',什么不是......没有运气.
我正在按照本教程http://www.parsonsmatt.org/programming/2015/06/07/servant-persistent.html通过servant创建API.我想自定义服务器以提供静态文件,但无法找到方法.
我正在使用stack
构建工具.
我将Main.hs
文件的运行修改为include static
(run port $ static $ logger $ app cfg
)并导入Network.Wai.Middleware.Static (static)
.我还添加wai-middleware-static >=0.7.0 && < 0.71
到我的cabal文件中.
当我运行(更新:这部分完全是我的错误,我添加了封装到错误的小集团文件..跛脚导入Network.Wai.Middleware.Static作品和静态文件留在以下情况下,错误.任何人都搜索它并发现它很有用.)stack build
我得到:
Could not find module ‘Network.Wai.Middleware.Static’
Perhaps you meant
Network.Wai.Middleware.Gzip (from wai-extra-3.0.7.1@waiex_GpotceEdscHD6hq9p0wPOJ)
Network.Wai.Middleware.Jsonp (from wai-extra-3.0.7.1@waiex_GpotceEdscHD6hq9p0wPOJ)
Network.Wai.Middleware.Local (from wai-extra-3.0.7.1@waiex_GpotceEdscHD6hq9p0wPOJ)
Run Code Online (Sandbox Code Playgroud)
接下来我尝试使用servant serveDirectory
如下(简化):
type API = "users" :> Get '[JSON] [Person]
:<|> "static" :> Raw
server = createPerson :<|> serveDirectory "/static"
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Couldn't match type ‘IO’ …
Run Code Online (Sandbox Code Playgroud) 我一直在玩Scotty Web框架,并尝试使用wai-handler-devel来启用代码重新加载.这是一个示例应用程序
{-# LANGUAGE OverloadedStrings #-}
module Example where
import Data.Monoid (mconcat)
import Network.Wai
import Web.Scotty
handler :: ScottyM ()
handler = get "/:word" $ do
beam <- param "word"
html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]
main :: IO ()
main = scotty 3000 handler
Run Code Online (Sandbox Code Playgroud)
这里的问题是wai-handler-devel
期望得到一个(Application -> IO ()) -> IO ()
使事情有效的功能,但在这种情况下我只有ScottyM ()
和IO ()
.包Web.Scotty
和Web.Scotty.Trans
包中有一些功能,即以下内容
scottyApp :: ScottyM () -> IO Application …
在clojure
,我可以写这样的东西:
(defn wrap-my-header
[handler]
(fn [request]
(let [request (if (get-in request [:headers "my-header"])
(assoc request :has-my-header? true)
request)]
(handler request))))
Run Code Online (Sandbox Code Playgroud)
在这个中间件,我检查,如果我在有一个非空值my-header
的:headers
,如果是,我将在附加一些数据request
映射.这表明我可以对待request
并response
作为一种有点"有状态"的数据.
我仍然是哈斯克尔的新人,并且想做类似的事情scotty
.在查看中间件的类型后,我可以创建这样的中间件:
myMiddleware :: Middleware
myMiddleware app req respond = app req respond
Run Code Online (Sandbox Code Playgroud)
在长时间盯着这个类型后,我仍然不知道该怎么做.一些阅读和思考让我认为这是不可能的,Middleware
只能使处理程序短路和/或改变生成的响应.这是真的?
<command line>: can't load .so/.DLL for: libz.so (libz.so: cannot open shared object file: no such file or directory)
这是我在尝试安装某些WAI库时遇到的错误:
这似乎与模板Haskell有动态链接问题有关.链接到zlib(或libz或z或libz1g或其他任何月份包管理器选择调用标准压缩库的味道)的其他包工作正常,只有那些试图在编译时动态链接到它的包时间.
我用过 nix-env -i zlib && nix-shell -p zlib
我做apt-get install
的 zlib1g
,zlib1g-dev
,lib32z1
,zlib1g:i386
,的libc6-I386, ,lib32stdc++6
,lib32gcc1
(?!)lib32ncurses5
其他zlib的问题的建议.
whereis libz.so
给人/usr/lib/x86_64-linux-gnu/libz.a /usr/lib/x86_64-linux-gnu/libz.so
所以我觉得库实际安装.
我通过剥离所有的TH代码得到了一个精简版的wai-app-static工作,但我无法在不打破整个包的情况下从wai-websockets中提取它.
有没有人找到一种方法来安装这些库,最好是使用Nix,但是在这一点上我可以实现它.我已经尝试了三天来获得一个有效的构建,并且已经耗费了整个星期的项目时间,而没有编写我自己的代码.我会采取任何可行的黑客攻击.
有人要求使用命令行.这是由cabal生成的:
/home/jfmiller28/.nix-profile/bin/ghc --make -fbuilding-cabal-package -O -static -dynamic-too -dynosuf dyn_o -dynhisuf dyn_hi -outputdir dist/build -odir dist/build -hidir dist/build -stubdir dist/build -i -idist/build …
Run Code Online (Sandbox Code Playgroud) haskell ×10
haskell-wai ×10
scotty ×3
yesod ×3
clojure ×1
haskell-warp ×1
servant ×1
websocket ×1
zlib ×1