Template Haskellを使ってみる3

listからtupleを生成する関数と、tupleからlistを生成する関数を作ろうと思ったものの型の扱いが上手く行かない・・・。


そんな事は起こる筈無いと思うんだけど・・・良く分からん!!!!!!!

詰まる

:t (\y -> $(return (TupE (map (\x -> LitE $ IntegerL x) y))))

    GHC stage restriction: `y'
      is used in a top-level splice, and must be imported, not defined locally

これがやりたいだけなんだけどなー。

:t [|\y -> $(return (TupE (map (\x -> LitE $ IntegerL x) y)))|]

Stage error: `y' is bound at stage 2 but used at stage 1

[Integer] -> [Exp]にしたいんだけど・・・。


ここでLamEとか使っちゃうと、mapがExpとかを取ってしまって型が合わなく成るという終わっとる。

LamE [(VarP $ mkName "x")] (TupE $ map (\y -> (LitE $ IntegerL y)) (VarE $ mkName "x"))

適当にこんなの書いたら、mapのsecond argの型が合わない舐めるなと言われる。

これ何・・・?

list2tuple x = do (return ($([| \x -> (TupE $ map (\y -> (LitE $ IntegerL y)) x) |]) x))

main = print $ show ($(list2tuple [1,2,3,4,5,6,7,8,9]))

リストからタプルに変形しますけどー。