0

やあ。

これが私が動作させようとしているコードです:

getGameR :: Handler Html
getGameR = do
    sess <- getSession
    defaultLayout $ do
        setTitle "Game"
        $(widgetFile "hamletFile")
    where
        person = read $ fromJust $ Map.lookup "person" sess :: Person

data Person = Person
    {
        name :: Text
    }
    deriving (Show, Read)


エラーは次のとおりです。

Handler/MyHandler.hs:87:56: Not in scope: `sess'


私がやろうとしているのは、Yesod セッション (Person 型のデータ) からデータを抽出し、それを 'person' 内に格納して、hamlet ファイル内で使用できるようにすることです。

そのエラーを回避する方法はありますか?

もし無理なら別の方法を教えていただけないでしょうか?

前もって感謝します。

4

2 に答える 2

4

sessdoブロックに対してローカルであるため、person定義の範囲外です。そのエラーに関する限りlet、ブロック内で使用doするだけで十分です。

getGameR :: Handler Html
getGameR = do
    sess <- getSession
    let person = read $ fromJust $ Map.lookup "person" sess :: Person
    defaultLayout $ do
        setTitle "Game"
        $(widgetFile "hamletFile")
于 2013-10-17T20:12:59.083 に答える
1

単一の値を検索するだけの場合は、lookupSession代わりに使用することを検討してください。また、fromJustキーがセッションにない場合は例外をスローします。次を使用できますfromMaybe

getGameR :: Handler Html
getGameR = do
    mbPersonName <- lookupSession "person"
    let defaultPerson = Person "anonymous"
    let person = fromMaybe defaultPerson (readMaybe .unpack =<< mbPersonName) :: Person
    defaultLayout $ do
        setTitle "Game"
        $(widgetFile "hamletFile")

セッションを処理するためのヘルパーは次のとおりです。

import Text.Read (readMaybe)
import Data.Maybe (fromMaybe)

readSession :: Read a => Text -> Handler (Maybe a)
readSession name = do
    textValue <- lookupSession name
    return (readMaybe . unpack =<< textValue)

readSessionDef :: Read a => a -> Text -> Handler a
readSessionDef def name =  do
    mbValue <- readSession name
    return $ fromMaybe def mbValue

readSession読み取り可能なものはすべて読み取り、 を返しますMaybereadSessionDefそのようなキーがセッションに存在しない場合、デフォルト値を返します:

getGameR :: Handler Html
getGameR = do
    person <- readSessionDef (Person "anonymous") "person"
    defaultLayout $ do
        setTitle "Game"
        $(widgetFile "hamletFile")
于 2013-10-18T03:08:12.117 に答える