2012-06-26 38 views
1

有人可以解釋默認單元project template中發生了什麼嗎?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. 如何擺脫身份驗證層,說如果我只想做一個簡單的個人網絡應用程序?

該文檔和一個教程主要涵蓋小卡片(或模板),但它不會覆蓋任何Haskell。很高興看到如何編寫應用程序或博客等書店的例子(官方網站以markdown存儲他們的博客條目 - 所以我不確定那裏發生了什麼)。

+0

關於3.請參閱http://stackoverflow.com/questions/11114781/snap-0-9-routing-behavior – lbolla

+0

捕捉文檔假定您已經有一些Haskell的知識。聽起來你應該從一些基本的Haskell教程開始。 – mightybyte

回答

5

我在學習Haskell自己的過程中,我一無所知快,但我可以盡我所能來回答我所看到的:

1)

Snap.Snaplet模塊定義類型:Handler b v a
因此,任何Handler都有三個類型參數:bva
此外,(Handler b v)在同一模塊中聲明爲Monad。這可能會告訴你一些關於最後的a參數的用途。

IOMonad的另一個例子。
IO()與IO有關的「某事」,然後返回一個空值()
IO a確實與IO有關的「某些東西」,然後返回a類型的其他東西。

例如,它並沒有真正意義的做x <- putStrLn "text"因爲putStrLn有返回類型IO()。從技術上講,你可以,但通常沒有用。 putStrLn做IO,就這樣,拒絕將任何事情傳遞給未來的功能。具體來說,它會向控制檯輸出一些內容,但並不會告訴程序的其他部分。

str <- getLine有意義,因爲getLine的型號爲IO String。它執行IO,然後告知strString。它產生的結果是該函數的其餘部分可以直接使用。

對於Handler,你可以忘記一個處理器做什麼,看看它是這樣的:

let M = Handler b v
M被宣佈爲一個單子。
因此,M a做了「某事」,然後返回a
M()做「某事」並且不返回任何東西。

從那裏你可以告訴一些關於handleLogin這樣的功能。它需要它的參數,並且可能會根據那些對Handler做些什麼。之後,假設沒有錯誤,程序將移動到下一行,而不會在下一行告訴函數發生了什麼。

Snap中有一些函數返回一個Handler而不是()作爲最後一個參數。如果你看到這樣的功能,這意味着它具有有意義的回報價值。

4)

我懷疑這些模板更加的比你的意思,從打造事情的例子,但它的所有手工編寫的,所以我想你可以刪除認證步驟,如果你喜歡。類型App在「Application.hs」中定義,您可以在其中刪除其參數auth。然後你可以在項目的其餘部分刪除對它的引用。