2012-11-26 47 views
1

message/en.msg文件,如:枚舉AppMessage構造

Category1: some text 1 
Category2: some text 2 
    ... 
CategoryN: some text N 

而讓下一個有效的代碼:

getHomeR :: Handler RepHtml 
getHomeR = do 

    (msg :: AppMessage -> Text) <- getMessageRender 

    let list = T.concat $ map msg [MsgCategory1, MsgCategory7] 

    defaultLayout $ do 
     $(widgetFile "homepage") -- <p>List: #{list} 

然後,list包含MsgCategory1MsgCategory7翻譯。

我想要做一些這樣的:

let list = T.concat $ map msg [MsgCategory1 .. MsgCategory7] 

AppMessage,不導出Enum

我的另外一個選擇是無效太(不Read衍生太)

let list = T.concat $ map (\n -> msg $ read "MsgCategory" ++ show n) [1 .. 7] 

一般情況下,怎麼投「實時」 AppMessage元素?

非常感謝!

(!我愛耶索德:))

回答

0

的一種方式,我發現是here

deriving instance Enum AppMessage 
deriving instance Eq AppMessage 
deriving instance Read AppMessage 
deriving instance Show AppMessage 
... 

(需要-XStandaloneDeriving)

解釋:

變化Foundation.hs

-- Set up i18n messages. See the message folder. 
mkMessage "App" "messages" "en" 

-- Require extension: StandaloneDeriving 
deriving instance Enum AppMessage 

On site.cabal

extensions: TemplateHaskell 
      QuasiQuotes 
      OverloadedStrings 
      NoImplicitPrelude 
      CPP 
      MultiParamTypeClasses 
      TypeFamilies 
      GADTs 
      GeneralizedNewtypeDeriving 
      FlexibleContexts 
      EmptyDataDecls 
      NoMonomorphismRestriction 
      StandaloneDeriving