这在Snap中有什么作用?

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)
  1. 为什么它会返回()?
  2. 什么是"控制器"的标准签名(正如你在MVC中所说的那样)功能?
  3. 它如何知道index.tpl用作/路线的模板?
  4. 如何摆脱身份验证层,如果我只想制作一个简单的个人网络应用程序?

文档和教程主要涵盖了snapplets(或模板),但它并没有覆盖任何Haskell.很高兴看到如何编写像app或博客这样的书店的例子(官方快照网站将他们的博客条目存储在降价中 - 所以我不确定那里发生了什么).

Enr*_*nra 5

我自己正在学习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参数.然后,您可以在项目的其余部分中删除对它的引用.