簡體   English   中英

這在Snap中有什么作用?

[英]What do this do in Snap?

有人可以解釋默認的快照項目模板中發生了什么嗎?

--------------------------------------------------------------------------
-- | 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. 如果我只想制作一個簡單的個人Web應用程序,該如何擺脫身份驗證層?

文檔和教程主要涵蓋了snapplet(或模板),但沒有涵蓋任何Haskell。 很高興看到一個示例,該示例說明了如何編寫諸如應用程序之類的書店或博客(官方的snap網站將其博客條目存儲在markdown中-因此我不確定那里發生了什么)。

我正在學習Haskell自己,而我對Snap一無所知,但是我會盡力回答我所看到的:

1)

Snap.Snaplet模塊定義一種類型: Handler bva
因此,任何Handler都具有三個類型參數: bva
同樣, (Handler bv)在同一模塊中聲明為Monad 這可能會告訴您有關參數最后a含義的信息。

IOMonad另一個例子。
IO ()執行與IO有關的“操作”,然后返回() (空值)。
IO a執行與IO有關的“某事”,然后返回其他類型為a

例如,執行x <- putStrLn "text"並沒有任何意義,因為putStrLn具有返回類型IO () 從技術上講,您可以,但是通常沒有用。 putStrLn做IO,僅此putStrLn ,拒絕將任何內容繼續傳遞給將來的功能。 具體來說,它會在控制台上打印一些內容,但不會告訴程序的其余部分。

str <- getLine很有意義,因為getLine類型為IO String 它做IO,然后告訴str一個String 產生的結果是該函數的其余部分可以直接使用。

對於Handler ,您可能會忘記處理程序的功能,而是這樣看待它:

let M = Handler bv
M被宣布為單子。
因此, M a執行“某事”,然后返回a
M ()做“某事”,不返回任何東西。

由此,您可能可以了解有關handleLogin類的功能的信息。 它接受參數,並可能基於這些參數對Handler做一些事情。 之后,假設沒有錯誤,程序將移至下一行,而無需告訴下一行功能。

Snap中有一些函數返回Handler ,最后一個參數的() 如果看到這樣的函數,則意味着它帶有有意義的返回值。

4)

我懷疑模板不是示例示例,而是您打算構建的示例,但是它們都是手動編寫的,因此,我認為您可以根據需要刪除身份驗證步驟。 App類型在“ Application.hs”中定義,您可以在其中刪除其auth參數。 然后,您可以在項目的其余部分中刪除對其的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM