こんにちは、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)) []
]