私はコンパイル時のエラーやURIというような表現をしたいと思います。コンパイル時にチェックされたURI
[uri|http://stackoverflow.com|]
はコンパイルする必要がありますが、
[uri|foo:/bar:\|]
はいけません。
私はQuasiQuotesに出くわしました。これは明らかにこの種の問題です。しかし、私はURI
からQ Exp
を作成することはできません。それはURI
ためLift
インスタンスを望んでいるので
import Language.Haskell.TH.Quote
import Language.Haskell.TH.Syntax
import Language.Haskell.TH
import URI.ByteString
import Data.ByteString.Char8
uri = QuasiQuoter { quoteExp = \s ->
let
uri = either (\err -> error $ show err) id (parseURI laxURIParserOptions (pack s))
in
[| uri |]
}
は、コンパイルされません。しかし、私はGADTの性質のため、どのように作成するのかは分かりません。
deriving instance Lift (URIRef a)
約Lift ByteString
についてはお詫びしますが、私は1つ書くことはできません。もう一つの方法は、Data URI
だろうが、それは私がGenerics
を使用することを好むだろうが、私はQQ APIとそれらを使用するかどうかはわかりません
85 1 error • Couldn't match type ‘a’ with ‘Absolute’
‘a’ is a rigid type variable bound by
the instance declaration at uri-bytestring/src/URI/ByteString/Types.hs:85:1
Expected type: c (URIRef a)
Actual type: c (URIRef Absolute)
• In the expression: k (k (k (k (k (z URI)))))
In a case alternative:
ghc-prim-0.5.0.0:GHC.Types.I# 1# -> k (k (k (k (k (z URI)))))
In the expression:
case constrIndex c of {
ghc-prim-0.5.0.0:GHC.Types.I# 1# -> k (k (k (k (k (z URI)))))
_ -> k (k (k (k (z RelativeRef)))) }
When typechecking the code for ‘gunfold’
in a derived instance for ‘Data (URIRef a)’:
To see the code I am typechecking, use -ddump-deriv
• Relevant bindings include
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (URIRef a)
(bound at uri-bytestring/src/URI/ByteString/Types.hs:85:1) (haskell-stack-ghc)
で失敗します。