Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
Haskell无法创建TypeClass的实例_Haskell_Types_Instance_Typeclass - Fatal编程技术网

Haskell无法创建TypeClass的实例

Haskell无法创建TypeClass的实例,haskell,types,instance,typeclass,Haskell,Types,Instance,Typeclass,我是Haskell的新手,正在尝试创建一个带有实例的类 我有以下代码,我想说: 1) 分支可以在其第一个位置保存任何类型, 2) 使一个类成为线性的,它接受线性的东西并返回一个数字 3) 如果分支持有的第一件东西是Num类的一部分,则将分支设置为线性的实例 data Branch a = Branch a Integer deriving (Show, Eq) class Linear l where length :: (Num a) => l -> a instanc

我是Haskell的新手,正在尝试创建一个带有实例的类

我有以下代码,我想说: 1) 分支可以在其第一个位置保存任何类型, 2) 使一个类成为线性的,它接受线性的东西并返回一个数字 3) 如果分支持有的第一件东西是Num类的一部分,则将分支设置为线性的实例

data Branch a = Branch a Integer deriving (Show, Eq)

class Linear l where
    length :: (Num a) => l -> a

instance (Num a) => Linear (Branch a) where
    length (Branch len _) = len
我得到一个错误: 无法推断(a~a1) 从由..处的实例声明绑定的上下文(Num a)


有人知道如何用Haskell表达我想说的吗?

你的类定义说,
length
必须能够返回用户请求的任何Num类型。因此,如果用户想要一个整数,length方法必须给他一个整数。如果他想要一个Int或Double,那么length也必须给他这个值

但是,在实例声明中提供的长度函数不符合要求。例如,当您对
分支整数
调用length时,length将返回一个
整数
。即使用户要求,它也不会返回
Int
Double

使代码正常工作的一种方法是使用多参数类型类来定义带有两个参数的线性,其中第二种类型是数值类型
length
应该返回。然后您可以有一个
线性(分支a)a
的实例。您可能还希望使用Functional Dependencies扩展使其更可用。也可以使用“类型族”扩展来实现类似效果,而不是使用第二个类型参数


另一种方法是将实例声明更改为需要
Integral a
而不是
Num a
,然后使用
from Integral len
作为返回值。这将把存储在分支中的整数类型转换为用户请求的数值类型。当然,需要注意的是,使用非整数数值进行分支,不会以这种方式成为
线性
的实例。

我试图理解多参数类型类,但它们高于我的级别。