Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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函数”;新类型;?_Haskell_Types_Newtype - Fatal编程技术网

如何定义参数为“的Haskell函数”;新类型;?

如何定义参数为“的Haskell函数”;新类型;?,haskell,types,newtype,Haskell,Types,Newtype,我定义了一个新类型,称为Poly。Poly是多项式的列表表示形式(Num的列表),我试图定义一个函数“chop”,从Poly的末尾去掉多余的0 Chop将一个多边形作为参数,然后返回一个多边形。出于某种原因,我收到以下错误消息: 应为约束,但“Poly a”具有种类“*” 在“chop”的类型签名中:chop::Poly a=>a->a 在Haskell中,类型签名中的=>字符表示类型限制。这与Haskell TypeClass结合使用,以便抽象出可以在高抽象级别上使用的函数的实现细节 在您的示

我定义了一个新类型,称为Poly。Poly是多项式的列表表示形式(Num的列表),我试图定义一个函数“chop”,从Poly的末尾去掉多余的0

Chop将一个多边形作为参数,然后返回一个多边形。出于某种原因,我收到以下错误消息:

应为约束,但“Poly a”具有种类“*” 在“chop”的类型签名中:chop::Poly a=>a->a


在Haskell中,类型签名中的
=>
字符表示类型限制。这与Haskell TypeClass结合使用,以便抽象出可以在高抽象级别上使用的函数的实现细节

在您的示例中,
Poly a
是一种全新的类型,根据类型系统,而不是类型类,因此您的函数
chop
可能打算直接对其进行操作:

chop :: Poly a -> Poly a
chop (P l) = if (last l) == 0 then chop (P $ init l) else P l
但是等等,这不是编译!限制来自与0的比较:
(最后一个l)=0
。这里我们隐含地说,我们希望我们的
Poly a
的元素与零相当,或者换句话说
a
必须是
Num a
的一个实例。毕竟,你不能切掉
多边形(可能是字符串)
类型的多项式。我们的修订版签名是:

chop :: Num a => Poly a -> Poly a
chop (P l) = if (last l) == 0 then chop (P $ init l) else P l
需要考虑的一点是:因为您使用的是
newtype
而不是普通的
类型,Haskell将您的
polya
视为一种全新类型。为了使其与列表互换,可以使用类型同义词:

这将简化chop的实施:

chop :: Num a => Poly a -> Poly a
chop l = if (last l) == 0 then chop (init l) else l

答案与相同,尽管我不太愿意将其标记为重复:
polya
是一种类型,所以将其作为一种类型使用<代码>印章::多边形a->多边形a
。之后可能还有其他问题需要解决。
Eq
不再是
Num
的超类。如果您希望它与数字相等,则需要
(等式a,Num a)=>
type Poly a = [a]
chop :: Num a => Poly a -> Poly a
chop l = if (last l) == 0 then chop (init l) else l