[英]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")
]
index.tpl
用作/
路由的模板? 文檔和教程主要涵蓋了snapplet(或模板),但沒有涵蓋任何Haskell。 很高興看到一個示例,該示例說明了如何編寫諸如應用程序之類的書店或博客(官方的snap網站將其博客條目存儲在markdown中-因此我不確定那里發生了什么)。
我正在學習Haskell自己,而我對Snap一無所知,但是我會盡力回答我所看到的:
1)
Snap.Snaplet
模塊定義一種類型: Handler bva
。
因此,任何Handler
都具有三個類型參數: b
, v
和a
。
同樣, (Handler bv)
在同一模塊中聲明為Monad
。 這可能會告訴您有關參數最后a
含義的信息。
IO
是Monad
另一個例子。
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.