Class Haskell声明Show类的实例
我试图将我的思想集中在Haskell中的类和数据结构上,特别是声明它的一个类型实例。我可以让它处理一些类和数据类型,但不是所有的类和数据类型,所以我肯定遗漏了一些东西。具体而言,我有以下数据声明:Class Haskell声明Show类的实例,class,haskell,instance,show,Class,Haskell,Instance,Show,我试图将我的思想集中在Haskell中的类和数据结构上,特别是声明它的一个类型实例。我可以让它处理一些类和数据类型,但不是所有的类和数据类型,所以我肯定遗漏了一些东西。具体而言,我有以下数据声明: data LinkedList a = End | Link a (LinkedList a) 我想为该类型声明一个Show实例,以便输出看起来接近“el1,el2,el3,el4,…” 正如所料,这不起作用。。。知道为什么吗?我想我理解“数据”和“类型”的含义,但我不确定我是否熟悉类和实例。多谢各
data LinkedList a = End | Link a (LinkedList a)
我想为该类型声明一个Show实例,以便输出看起来接近“el1,el2,el3,el4,…”
正如所料,这不起作用。。。知道为什么吗?我想我理解“数据”和“类型”的含义,但我不确定我是否熟悉类和实例。多谢各位
instance Show LinkedList where
LinkedList
不是类型,LinkedList a
是类型。纠正这一点,我们得到
instance Show (LinkedList a) where
然后,我们得到另一个错误,因为我们对a
类型的值调用show
。我们需要要求a
也属于类Show
instance Show a => Show (LinkedList a) where
现在应该可以了。您会遇到什么错误?请将您的问题包含在这一重要细节中。谢谢!那么为什么LinkedList不是一种类型呢?@OmarKahol因为它没有参数。它是一个类型为
*->*
的构造函数,即(大致)从类型到类型的函数,我们需要向它传递一个参数来获取类型。@OmarKahol LinkedList是一个“类型级函数”,它生成类型。它的类型不同于(*5)
不是一个数字,但是如果你传递一个数字,你就会得到一个数字。@OmarKahol:你可以通过GHCi中的:kind
命令了解更多关于种类的信息:kind Show
提供了*->约束
,因为Show
是一个类型类,它接受kind*
类型(一个“基类型”,包含值的类型)并返回约束:kind LinkedList
给出了*->*
,因为LinkedList
是一个类型构造函数,它接受kind*
的类型,并生成同样是kind*
的类型。因此,您无法编写Show LinkedList
,因为*
和*->*
不匹配这是一种类型错误,类似于类型级别的类型错误<代码>*也可以写成类型
(从GHC.Types
导入)。
instance Show a => Show (LinkedList a) where