こんにちは、Template Haskellを書いている最中に
Illegal variable name: Mail
というエラーが出てきて困っています。
エラーとしては
現在、会社の日報のためにメール送信スクリプトを作成しようと考えています。jsonでデータの構造を書いておき、そのインスタンスをEDEでメールの定型文に読み込む方針で す。
対象となるコードはこちらになります。Template Haskell自体まだ概念に馴染めておらず、なかなか苦戦しております…
なにかおすすめの資料等あれば教えていただけるとありがたいです:writing_hand:
Illegal variable name: Mail
というエラーが出てきて困っています。
エラーとしては
mailscript/app/Main.hs:18:1: error: Illegal variable name: 'Mail' When splicing a TH declaration: main_0 = do {bodyTpl_1 <- eitherParseFile "./template/body.txt"; titleTpl_2 <- eitherParseFile "./template/title.txt"; Data.Traversable.mapM (\property_3 -> GHC.Base.pure (Language.Haskell.TH.Syntax.BindS (Language.Haskell.TH.Syntax.VarP (Language.Haskell.TH.Syntax.mkName GHC.Base.$ ("input" GHC.Base.++ property_3))) (Language.Haskell.TH.Syntax.VarE System.IO.getLine))) ps; let {env_4 = fromPairs [(Data.Text.Lazy.unpack GHC.Base.$ Lib.key (Lib.Schema (Data.Text.Lazy.pack "mail") [Data.Text.Lazy.pack "todayWorkSchedule", Data.Text.Lazy.pack "todayOutcome", Data.Text.Lazy.pack "tomorrowWorkSchedule", Data.Text.Lazy.pack "thoughts"])) Data.Aeson.Types.ToJSON..= (Data.Aeson.Types.ToJSON.toJSON GHC.Base.$ Data.Foldable.foldl (GHC.Base.$) Main.Mail ps)]; body_5 = Data.Either.either GHC.Err.error toStrict GHC.Base.$ (bodyTpl_1 GHC.Base.>>= (`eitherRender` env_4)); title_6 = Data.Either.either GHC.Err.error toStrict GHC.Base.$ (titleTpl_2 GHC.Base.>>= (`eitherRender` env_4))}; uprint body_5; uprint title_6} | 18 | do | ^^...
現在、会社の日報のためにメール送信スクリプトを作成しようと考えています。jsonでデータの構造を書いておき、そのインスタンスをEDEでメールの定型文に読み込む方針で す。
対象となるコードはこちらになります。Template Haskell自体まだ概念に馴染めておらず、なかなか苦戦しております…
なにかおすすめの資料等あれば教えていただけるとありがたいです:writing_hand:
data Properties = Properties [Text] deriving Show instance FromJSON Properties where parseJSON (Array v) = Properties <$> parseJSON (Array v) parseJSON _ = mzero data Schema = Schema { key :: Text , properties :: [Text] } deriving (Lift, Show) instance FromJSON Schema where parseJSON (Object v) = if size v /= 1 then fail "expected a pair." else do hs <- parseJSON (Object v) let ls = toList hs return . (\(key, Properties properties) -> Schema key properties) $ head ls toTitle :: Text -> String toTitle = let toTitleString (c:cs) = (toUpper c):cs in toTitleString . unpack schemaToData :: Schema -> Q [Dec] schemaToData schema = do name <- ( newName . toTitle $ key schema ) pure [ DataD [] name [] Nothing [ RecC ( mkName . toTitle $ key schema ) ( Prelude.map (\property -> ( mkName $ unpack property, Bang Language.Haskell.TH.NoSourceUnpackedness Language.Haskell.TH.NoSourceStrictness, ConT ''Text )) ( properties schema ) ) ] [ DerivClause Nothing [ConT ''Show, ConT ''Generic] ] , InstanceD Nothing [] (AppT (ConT ''ToJSON) (ConT name)) [] , InstanceD Nothing [] (AppT (ConT ''FromJSON) (ConT name)) [] ]