【问题标题】:What do this do in Snap?这在 Snap 中有什么作用?
【发布时间】:2012-06-26 18:13:04
【问题描述】:

有人能解释一下默认快照project template 中发生了什么吗?

--------------------------------------------------------------------------
-- | 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")
         ]
  1. 为什么会返回 ()?
  2. “控制器”(您在 MVC 中将其称为)函数的标准签名是什么?
  3. 它怎么知道使用index.tpl 作为/ 路由的模板?
  4. 如果我只想制作一个简单的个人网络应用,我该如何摆脱身份验证层?

文档和教程主要涵盖了 snapplet(或模板),但没有涵盖任何 Haskell。很高兴看到一个如何编写书店之类的应用程序或博客的示例(官方 snap 网站将他们的博客条目存储在 markdown 中 - 所以我不确定那里发生了什么)。

【问题讨论】:

标签: haskell haskell-snap-framework


【解决方案1】:

我自己也在学习Haskell,对Snap一无所知,但我能尽力回答我能看到的:

1)

Snap.Snaplet 模块定义了一个类型:Handler b v a
所以,任何Handler 都有三个类型参数:bva
此外,(Handler b v) 在同一模块中声明为Monad。这可能会告诉您最后一个a 参数的用途。

IOMonad 的另一个示例。
IO () 执行与 IO 相关的“某事”,然后返回空值 ()
IO a 执行与 IO 相关的“某事”,然后返回 a 类型的其他内容。

例如,执行 x &lt;- putStrLn "text" 并没有真正意义,因为 putStrLn 的返回类型为 IO ()。从技术上讲,你可以,但它通常没用。 putStrLn 做 IO,仅此而已,拒绝将任何东西传递给未来的功能。具体来说,它会向控制台打印一些内容,但不会告诉程序的其余部分它这样做了。

str &lt;- getLine 有意义,因为getLine 的类型为IO String。它执行 IO,然后告诉str String。它会产生一个结果,该函数的其余部分可以直接使用。

对于Handler,您可能会忘记处理程序的作用,并像这样查看它:

let M = Handler b v
M 被声明为 monad。
所以,M a 做了“某事”,然后返回了 a
M () 做了“某事”,但没有返回任何内容。

从中您可能可以了解handleLogin 之类的函数在做什么。它接受它的论点,并且可能基于这些论点对Handler 做一些事情。之后,假设没有错误,程序移到下一行,而不告诉下一行的函数发生了什么。

Snap 中有一些函数返回 Handler,最后一个参数不是 ()。如果你看到这样的函数,这意味着它带有一个有意义的返回值。

4)

我怀疑模板更多的是示例而不是您要构建的东西,但它们都是手动编写的,所以如果您愿意,我认为您可以删除身份验证步骤。 App 类型在“Application.hs”中定义,您可以在其中删除其auth 参数。然后,您可以在项目的其余部分中删除对它的引用。

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多