Haskell:显示/递归数据类型的非法实例声明

Haskell:显示/递归数据类型的非法实例声明,haskell,Haskell,我一直在寻找这个,但我没有找到可靠的东西 我正在用我自己的数据类型制作我自己的模块,然后我尝试制作一个show实例,当时事情变得一团糟。我给你看看 data listOfFav a = Insert (a,Bool) (listOfFav a) | Empty deriving (Show) instance Show a => Show (listOfFav a) where show = ('{' :) . go where go Empty

我一直在寻找这个,但我没有找到可靠的东西

我正在用我自己的数据类型制作我自己的模块,然后我尝试制作一个show实例,当时事情变得一团糟。我给你看看

data listOfFav a = Insert (a,Bool) (listOfFav a) | Empty deriving (Show)

instance Show a => Show (listOfFav a) where
  show = ('{' :) . go
   where
      go Empty                 = "}"
      go (Insert (x,y) Vazia)  = show x ++ show y ++ "}"
      go (Insert (x,y) xs)     = show x ++ show y ++", " ++ go xs
出于某种原因,我得到了这个错误:

Illegal instance declaration for ‘Show (listaFavoritos a)’
  (All instance types must be of the form (T a1 ... an)
   where a1 ... an are *distinct type variables*,
   and each type variable appears at most once in the instance head.
   Use FlexibleInstances if you want to disable this.)
In the instance declaration for ‘Show (listaFavoritos a)’

如果有人能帮助我,我将非常感激。Haskell要求数据类型以大写字母开头。您的代码应该如下所示:

data ListOfFav a = Insert (a,Bool) (ListOfFav a) | Empty

instance Show a => Show (ListOfFav a) where
  show = ('{' :) . go
   where
      go Empty                 = "}"
      go (Insert (x,y) Empty)  = show x ++ show y ++ "}"
      go (Insert (x,y) xs)     = show x ++ show y ++", " ++ go xs

此外,Haskell只允许每个数据类型有一个
Show
实例。您可以使用
deriving Show
让Haskell编译器为您创建一个,也可以自己编写一个,但不能同时执行这两个操作。在上面的代码中,我删除了
派生Show
,以使手写实例优先。

尝试将listOfFav大写为
listOfFav
。您还需要将Vazia替换为Empty以解决未知类型错误。您还需要删除
派生(Show)
,因为它与您的手纺版本冲突。感谢您指出大写字母,我在这方面损失了30分钟,最初的问题是ListOfFav在数据上用大写字母L编写,在实例上用'L'编写。谢谢:)