Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class Haskell声明Show类的实例_Class_Haskell_Instance_Show - Fatal编程技术网

Class Haskell声明Show类的实例

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,…” 正如所料,这不起作用。。。知道为什么吗?我想我理解“数据”和“类型”的含义,但我不确定我是否熟悉类和实例。多谢各

我试图将我的思想集中在Haskell中的类和数据结构上,特别是声明它的一个类型实例。我可以让它处理一些类和数据类型,但不是所有的类和数据类型,所以我肯定遗漏了一些东西。具体而言,我有以下数据声明:

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