컴파일 시간 오류 또는 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
에 대한 불만 사항이 있지만 글을 쓸 수 없습니다. 또 다른 방법은 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)
실패합니다.