1

デフォルトのスナッププロジェクト テンプレートで何が起こっているのか説明してもらえますか?

--------------------------------------------------------------------------
-- | 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 アプリのみを作成したい場合など、認証レイヤーを削除するにはどうすればよいですか?

ドキュメントとチュートリアルでは、主にスナップレット (またはテンプレート) について説明していますが、Haskell については触れていません。書店のようなアプリやブログの書き方の例を見るといいでしょう (公式のスナップ Web サイトでは、ブログのエントリがマークダウンで保存されているため、そこで何が起こっているのかわかりません)。

4

1 に答える 1

5

私は自分自身で Haskell を学習している途中で、Snap については何も知りませんが、私が見ることができるものに答えるために最善を尽くすことができます。

1)

Snap.Snapletモジュールはタイプを定義します: Handler b v a.
したがって、 anyには、 、、およびのHandler3 つの型パラメーターがあります。 また、は同じモジュールで と宣言されています。おそらく、最後のパラメーターの目的について何かを知ることができます。bva
(Handler b v)Monada

IOの別の例ですMonad
IO ()IO に関係する「何か」を実行し()、空の値を返します。
IO aIO に関係する「何か」を実行してから、 type の他の何かを返しますa

x <- putStrLn "text"たとえば、 putStrLn には戻り値の型があるため、実際には意味がありませんIO ()。技術的には可能ですが、通常は役に立ちません。putStrLnIO を実行するだけで、将来の機能に何かを渡すことを拒否します。具体的には、コンソールに何かを出力しますが、そのことをプログラムの残りの部分に伝えません。

str <- getLinegetLinetypeがあるので理にかなっていIO Stringます。IO を実行しstrString. 関数の残りの部分が直接使用できる結果を生成します。

の場合Handler、ハンドラーが何をするかを忘れて、次のように見ることができます。

let M = Handler b v
Mモナドであると宣言されています。
したがって、M a「何か」を実行してから を返しますa
M ()「何か」を行い、何も返しません。

そこから、のような関数が何をしているのかについて何かを知ることができるでしょうhandleLoginHandlerそれはその引数を取り、おそらくそれらに基づいて/に対して何かをします。その後、エラーがなかったと仮定して、プログラムは次の行の関数に何が起こったかを通知せずに次の行に移動します。

Snapには、最後のパラメーターHandler以外の何かで を返す関数がいくつかあります。()そのような関数が表示された場合、それは意味のある戻り値を運ぶことを意味します。

4)

テンプレートは、構築するためのものというよりも例にすぎないと思いますが、すべて手動で記述されているため、必要に応じて認証手順を削除できると思います. タイプAppは「Application.hs」で定義されており、そのauthパラメーターを削除できます。次に、プロジェクトの残りの部分でそれへの参照を削除できます。

于 2012-06-26T09:19:55.727 に答える