我正在尝试使用here包中的OverloadedLabels和QuasiQuotes。使用普通镜头可以工作,但#foo在编译过程中会因解析错误而失败。field @"foo"也是如此。这是不是有更深层次的原因,或者可能是here的内插式解析器中的错误?
{-# language DataKinds #-}
{-# language DeriveGeneric #-}
{-# language DerivingStrategies #-}
{-# language OverloadedLabels #-}
{-# language OverloadedStrings #-}
{-# language TypeApplications #-}
{-# language QuasiQuotes #-}
import Control.Lens
import Data.Text (Text)
import qualified Data.Text.IO as T
import Data.Generics.Product
import Data.Generics.Labels
import Data.String.Here
import GHC.Generics (Generic)
data Test = Test
{ name :: Text
} deriving stock (Eq, Show, Generic)
_name :: Lens' Test Text
_name f (Test a) = fmap (\a' -> Test a') (f a)
t :: Test
t = Test "test"
test :: IO ()
test = do
-- ok
T.putStrLn $ t ^. field @"name"
T.putStrLn $ t ^. #name
putStrLn [i|${t ^. _name}|]
-- parse error
putStrLn [i|The name is ${t ^. field @"name"}|]
putStrLn [i|The name is ${t ^. #name}|]#name的错误
test.hs:36:12: error:
• Exception when trying to run compile-time code:
Failed to parse interpolated expression in string: The name is ${t ^. #name}
(line 1, column 25):
0
SrcLoc "" 1 6
Parse error in expression: t ^.
CallStack (from HasCallStack):
error, called at src/Data/String/Here/Interpolated.hs:64:33 in here-1.2.13-HU0AD0x0dD36rY9YuL1gwE:Data.String.Here.Interpolated
Code: Language.Haskell.TH.Quote.quoteExp
i "The name is ${t ^. #name}"
• In the quasi-quotation: [i|The name is ${t ^. #name}|]
|
36 | putStrLn [i|The name is ${t ^. #name}|]
|发布于 2020-10-02 03:59:04
看起来haskell-src-meta还不支持OverloadedLabels。haskell-src-exts解析器有an OverloadedLabels case,但是haskell-src-meta在the ToExp instance for Exp中没有它的用例。我猜来自haskell-src-meta的“不受支持”的错误消息正在被here中的错误处理所吞噬。
发布于 2021-10-22 16:34:48
为了防止其他人偶然发现这一点,我在haskell-src-meta中创建了一个PR来解决这个问题:https://github.com/DanBurton/haskell-src-meta/pull/19
https://stackoverflow.com/questions/64155741
复制相似问题