Соскрести свой шаблон

Что касается 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

Другие вопросы по тегам