Неопределенная переменная типа 'a0', возникающая в результате использования 'print' - PullRequest
1 голос
/ 17 июня 2019

У меня следующая структура данных, и я пытаюсь написать для нее принтер:

data CTypeF a 
    = CVarF Int 
    | CArrF a a
    | CIntF
    | CBoolF
    deriving (Eq, Data, Show, Functor, Foldable, Traversable)  

Следующее дает мне ошибку:

my_test = do
    let c0 = CIntF
    (print CIntF)

Это сообщение об ошибке:

• Ambiguous type variable ‘a0’ arising from a use of ‘print’
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘a0’ should be.
      These potential instances exist:
        instance Show Constr -- Defined in ‘Data.Data’
        instance Show ConstrRep -- Defined in ‘Data.Data’
        instance Show DataRep -- Defined in ‘Data.Data’
        ...plus 40 others
        ...plus 166 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
• In a stmt of a 'do' block: (print CIntF)
          In the expression:
            do let c0 = CIntF
               (print CIntF)

Я видел следующий вопрос Неоднозначная переменная типа "b1", возникающая в результате использования "print"

и изменил мой код, чтобы сделать (print CIntF :: CTypeF), но я получаю:

• Expecting one more argument to ‘CTypeF’
      Expected a type, but ‘CTypeF’ has kind ‘* -> *’

Я немного растерялся, в чем проблема. Может ли кто-нибудь указать, что я здесь делаю не так?

Ответы [ 2 ]

5 голосов
/ 17 июня 2019

Как говорится в сообщении об ошибке, CTypeF принимает аргумент.CTypeF не является типом, но, например, CTypeF () или CTypeF Int или CTypeF [(String, Double)].

Ситуация аналогична print Nothing и пытается исправить ее, добавив (Nothing :: Maybe).Вам необходимо указать Maybe () или Maybe Int или ...

Попробуйте

my_test = do
    let c0 = CIntF :: CTypeF ()
    print c0
1 голос
/ 17 июня 2019

Проблема в том, что, как видит Хаскелл, вы не сказали ему, что такое a в CTypeF a, по крайней мере, недостаточно для его печати.Вы можете попробовать print (CIntF :: CTypeF ()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...