Text.Parser.Token.StyleのemptyIdentsの使い方について
X(数字)
という形式の識別子をパースするパーサーをparsers
ライブラリで書こうと思い、Text.Parser.Token.Style.emptyIdents
を使って以下のようなIdentifierStyle
を定義しましたが、型エラーになってしまいます。
import Text.Trifecta
import Text.Parser.Token.Style
identStyle :: IdentifierStyle Parser
identStyle = emptyIdents {
_styleStart = char 'X' :: Parser Char,
_styleLetter = digit :: Parser Char
}
-- パーサをこのように定義したい(例: "X3" -> Var 3)
ident = Var . (read . tail) <$> ident
現状はとりあえずnaiveにident = Var . read <$> (char 'X' >> many digit)
と定義していますが、何故上のコードで型エラーが出るのか知りたいです。
具体的な型エラーは以下のようになります。
No instance for (Text.Parser.Token.TokenParsing t0)
arising from a use of Text.Parser.Token.Style.emptyIdents
The type variable t0 is ambiguous
Note: there are several potential instances:
instance (Text.Parser.Token.TokenParsing m,
Control.Monad.MonadPlus m) =>
Text.Parser.Token.TokenParsing
(transformers-0.3.0.0:Control.Monad.Trans.Identity.IdentityT m)
-- Defined in Text.Parser.Token
instance parsec-3.1.8:Text.Parsec.Prim.Stream
s m ghc-prim:GHC.Types.Char =>
Text.Parser.Token.TokenParsing
(parsec-3.1.8:Text.Parsec.Prim.ParsecT s u m)
-- Defined in Text.Parser.Token
instance attoparsec-0.12.1.3:Data.Attoparsec.Internal.Types.Chunk
t =>
Text.Parser.Token.TokenParsing
(attoparsec-0.12.1.3:Data.Attoparsec.Internal.Types.Parser t)
-- Defined in Text.Parser.Token
...plus 12 others
In the expression: Text.Parser.Token.Style.emptyIdents
In the expression:
Text.Parser.Token.Style.emptyIdents
{Text.Parser.Token._styleStart = Text.Parser.Char.char 'X' ::
Text.Trifecta.Parser.Parser ghc-prim:GHC.Types.Char,
Text.Parser.Token._styleLetter = Text.Parser.Char.digit ::
Text.Trifecta.Parser.Parser ghc-prim:GHC.Types.Char}
In an equation for identStyle :
identStyle
= Text.Parser.Token.Style.emptyIdents
{Text.Parser.Token._styleStart = Text.Parser.Char.char 'X' ::
Text.Trifecta.Parser.Parser ghc-prim:GHC.Types.Char,
Text.Parser.Token._styleLetter = Text.Parser.Char.digit ::
Text.Trifecta.Parser.Parser ghc-prim:GHC.Types.Char}