Соскрести свой шаблон
Что касается SYB, я новичок в этом
Я попытался выкрутить код, чтобы получить переменные в выражении с кодом
variables = removeDuplicate $ (everything (++) ([] `mkQ` f))
where
f (ExprVar st) = [st]
f _ = []
где removeDuplicate
выявляет повторяющиеся переменные в списке
ExprVar
мой тип данных Datatype также включает в себя ExprAdd
, Exprsub
,ExprMul
, ExprDiv
,ExprNum
для сложения, вычитания, умножения, деления и для числа соответственно.
Я получаю следующую ошибку при компиляции:
No instance for (Data a0) arising from a use of `everything'
The type variable `a0' is ambiguous
Possible cause: the monomorphism restriction applied to the following:
variables :: a0 -> [[Char]] (bound at ParserExpr.hs:107:1)
Probable fix: give these definition(s) an explicit type signature
or use -XNoMonomorphismRestriction
Note: there are several potential instances:
instance Data Expr -- Defined at ParserExpr.hs:24:28
instance (Data a, Data b) => Data (a -> b)
-- Defined in `Data.Generics.Instances'
instance Data DataType -- Defined in `Data.Generics.Instances'
...plus 43 others
In the expression: (everything (++) ([] `mkQ` f))
In an equation for `variables':
variables
= (everything (++) ([] `mkQ` f))
where
f (ExprVar st) = [st]
f _ = []
Пожалуйста, дайте мне знать, где я иду не так?
Спасибо
1 ответ
Сообщение об ошибке говорит точно, что не так и предоставляет два возможных решения, которые оба работают:
- добавлять
Data a => a -> [String]
как тип подписи - включить
-XNoMonomorphismRestriction
пометить в GHC (или добавитьLANGUAGE
прагма)
Для получения дополнительной информации см. https://www.haskell.org/haskellwiki/Monomorphism_restriction