And*_*yuk 1 haskell haskell-snap-framework
有人可以解释默认快照项目模板中发生了什么吗?
--------------------------------------------------------------------------
-- | Handle login submit
handleLoginSubmit :: Handler App (AuthManager App) ()
handleLoginSubmit =
loginUser "login" "password" Nothing
(\_ -> handleLogin err) (redirect "/")
where
err = Just "Unknown user or password"
-- | Render login form
handleLogin :: Maybe T.Text -> Handler App (AuthManager App) ()
handleLogin authError = heistLocal (bindSplices errs) $ render "login"
where
errs = [("loginError", textSplice c) | c <- maybeToList authError]
| The application's routes.
routes :: [(ByteString, Handler App App ())]
routes = [ ("/login", with auth handleLoginSubmit)
, ("/logout", with auth handleLogout)
, ("/new_user", with auth handleNewUser)
, ("", serveDirectory "static")
]
Run Code Online (Sandbox Code Playgroud)
index.tpl用作/路线的模板?文档和教程主要涵盖了snapplets(或模板),但它并没有覆盖任何Haskell.很高兴看到如何编写像app或博客这样的书店的例子(官方快照网站将他们的博客条目存储在降价中 - 所以我不确定那里发生了什么).
我自己正在学习Haskell,我对Snap一无所知,但我可以尽力回答我能看到的内容:
1)
该Snap.Snaplet模块定义了一种类型:Handler b v a.
因此,任何Handler有三种类型的参数:b,v,和a.
另外,(Handler b v)在同一模块中声明为a Monad.这可能会告诉你最后一个a参数的用途.
IO是另一个例子Monad.
IO ()做与"IO"有关的"事情",然后返回()一个空值.
IO a做与"IO"有关的"事情",然后返回其他类型的东西a.
例如,它没有意义,x <- putStrLn "text"因为putStrLn具有返回类型IO ().从技术上讲,你可以,但它通常没用.putStrLnIO就是这样,拒绝将任何东西传递给未来的功能.具体来说,它会向控制台打印一些东西,但它不会告诉程序的其余部分它是这样做的.
str <- getLine有道理,因为getLine有类型IO String.它做IO,然后讲述stra String.它产生的结果是函数的其余部分可以直接使用.
因为Handler,你可以忘记处理程序的作用,并像这样看待它:
let M = Handler b v
M被宣布为monad.
那么,M a"某事"然后返回一个a.
M ()做"某事"并且不返回任何东西.
从那以后你可以讲述一些函数handleLogin正在做什么.它需要它的参数,并且可能与Handler基于它们的东西相关.之后,假设没有错误,程序移动到下一行,而不告诉下一行的功能发生了什么.
Snap中有一些函数返回Handler除了()最后一个参数之外的其他函数.如果你看到这样的函数,就意味着它带有一个有意义的返回值.
4)
我怀疑模板比你想要构建的东西更多的例子,但它都是手工编写的,所以我认为如果你愿意,你可以删除身份验证步骤.该类型App在"Application.hs"中定义,您可以在其中删除其auth参数.然后,您可以在项目的其余部分中删除对它的引用.